/ Hex Artifact Content
Login

Artifact 41ac7b8c833ca1737d360e770373e96e38887e80c33f991d24784d7569d597ef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
5440: 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
5450: 72 2d 6d 61 70 20 64 6f 65 73 20 6e 6f 74 20 63  r-map does not c
5460: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
5470: 65 73 20 77 69 74 68 20 61 20 70 61 72 65 6e 74  es with a parent
5480: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 30 2e 20 43  .** page of 0. C
5490: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
54a0: 29 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  ) multiple times
54b0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 65   to output the e
54c0: 6e 74 69 72 65 0a 2a 2a 20 64 61 74 61 20 73 74  ntire.** data st
54d0: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 64 6f  ructure if it do
54e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
54f0: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 43 68  id btreePtrmapCh
5500: 65 63 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42  eck(BtShared *pB
5510: 74 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  t, Pgno nPage){.
5520: 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20    Pgno i;.  int 
5530: 62 50 72 6f 62 6c 65 6d 20 3d 20 30 3b 0a 20 20  bProblem = 0;.  
5540: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 20 3d  BtreePtrmap *p =
5550: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 0a 20 20 66   pBt->pMap;..  f
5560: 6f 72 28 69 3d 70 2d 3e 69 46 69 72 73 74 3b 20  or(i=p->iFirst; 
5570: 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
5580: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
5590: 2a 70 45 6e 74 72 79 20 3d 20 26 70 2d 3e 61 50  *pEntry = &p->aP
55a0: 74 72 5b 69 2d 70 2d 3e 69 46 69 72 73 74 5d 3b  tr[i-p->iFirst];
55b0: 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
55c0: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f  >eType==PTRMAP_O
55d0: 56 45 52 46 4c 4f 57 31 0a 20 20 20 20 20 7c 7c  VERFLOW1.     ||
55e0: 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
55f0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
5600: 0a 20 20 20 20 20 7c 7c 20 70 45 6e 74 72 79 2d  .     || pEntry-
5610: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42  >eType==PTRMAP_B
5620: 54 52 45 45 0a 20 20 20 20 29 7b 0a 20 20 20 20  TREE.    ){.    
5630: 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 61    if( pEntry->pa
5640: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
5650: 20 20 20 62 50 72 6f 62 6c 65 6d 20 3d 20 31 3b     bProblem = 1;
5660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5680: 7d 0a 0a 20 20 69 66 28 20 62 50 72 6f 62 6c 65  }..  if( bProble
5690: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  m ){.    for(i=p
56a0: 2d 3e 69 46 69 72 73 74 3b 20 69 3c 3d 6e 50 61  ->iFirst; i<=nPa
56b0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
56c0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
56d0: 74 72 79 20 3d 20 26 70 2d 3e 61 50 74 72 5b 69  try = &p->aPtr[i
56e0: 2d 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20  -p->iFirst];.   
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5700: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 0a  QLITE_CORRUPT, .
5710: 20 20 20 20 20 20 20 20 20 20 22 62 74 72 65 65            "btree
5720: 50 74 72 6d 61 70 43 68 65 63 6b 3a 20 70 67 6e  PtrmapCheck: pgn
5730: 6f 3d 25 64 20 65 54 79 70 65 3d 25 64 20 70 61  o=%d eType=%d pa
5740: 72 65 6e 74 3d 25 64 22 2c 20 0a 20 20 20 20 20  rent=%d", .     
5750: 20 20 20 20 20 28 69 6e 74 29 69 2c 20 28 69 6e       (int)i, (in
5760: 74 29 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  t)pEntry->eType,
5770: 20 28 69 6e 74 29 70 45 6e 74 72 79 2d 3e 70 61   (int)pEntry->pa
5780: 72 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  rent.      );.  
5790: 20 20 7d 0a 20 20 20 20 61 62 6f 72 74 28 29 3b    }.    abort();
57a0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 20 20 2f  .  }.}..#else  /
57b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
57c0: 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 23 20 64 65  NCURRENT */.# de
57d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
57e0: 41 6c 6c 6f 63 61 74 65 28 78 29 20 53 51 4c 49  Allocate(x) SQLI
57f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5800: 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
5810: 28 78 29 20 0a 23 20 64 65 66 69 6e 65 20 62 74  (x) .# define bt
5820: 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 78  reePtrmapBegin(x
5830: 2c 79 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  ,y)  SQLITE_OK.#
5840: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5850: 6d 61 70 45 6e 64 28 78 2c 79 2c 7a 29 20 0a 23  mapEnd(x,y,z) .#
5860: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5870: 6d 61 70 43 68 65 63 6b 28 79 2c 7a 29 20 0a 23  mapCheck(y,z) .#
5880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5890: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
58a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
58b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
58c0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
58d0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
58e0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
58f0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
5900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5910: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
5920: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5940: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
5950: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
5960: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5970: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
5980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5990: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
59a0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
59b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
59c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
59d0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
59e0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
59f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5a00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5a10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
5a20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
5a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5a40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5a50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
5a60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5a70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
5a80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
5a90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
5aa0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
5ab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
5ac0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
5ad0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
5ae0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
5af0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
5b10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
5b20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
5b30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
5b40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
5b50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
5b60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
5b70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
5b80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
5b90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
5ba0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
5bb0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5bd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
5be0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
5bf0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
5c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
5c10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
5c20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
5c30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
5c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5c50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
5c60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
5c70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
5c80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
5c90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
5ca0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5cb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
5cc0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
5cd0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
5ce0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5cf0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5d00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
5d10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
5d40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
5d50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
5d60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
5d70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5d80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
5d90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
5da0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
5db0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5dc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
5dd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
5de0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
5df0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
5e00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5e10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
5e20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
5e30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
5e40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
5e50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5e70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5e90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
5ea0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5eb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
5ec0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5ed0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
5ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
5ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
5f00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5f10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
5f20: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
5f30: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
5f40: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
5f50: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
5f60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
5f70: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
5f80: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
5f90: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
5fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
5fb0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5fc0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
5fd0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
5fe0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
5ff0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
6000: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
6010: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
6020: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
6030: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
6040: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
6050: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
6060: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
6070: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
6080: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
6090: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
60a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
60b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
60c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
60d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
60e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
60f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
6100: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
6110: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
6120: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
6130: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
6140: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
6150: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6160: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
6170: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
6180: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
6190: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
61a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
61b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
61d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
61e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6200: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
6210: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
6220: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
6230: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
6240: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
6250: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
6260: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
6270: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
6280: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
6290: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
62a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
62b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
62c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
62d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
62e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
62f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
6300: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6310: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6320: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
6330: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
6340: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
6350: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
6360: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
6370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
6380: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
6390: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
63a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
63c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
63d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
63e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
63f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
6400: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
6410: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
6420: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
6430: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6440: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
6450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6460: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
6470: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
6480: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
6490: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
64a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
64b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
64c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
64d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
64e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
64f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
6500: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
6510: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6520: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
6530: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
6540: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
6550: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
6560: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
6570: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
6580: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
6590: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
65a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
65b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
65c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
65d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
65e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
65f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
6600: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6610: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
6620: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
6630: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
6640: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
6650: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
6660: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
6670: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
6680: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
6690: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
66a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
66b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
66c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
66d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
66e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
66f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
6700: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
6710: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6720: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
6730: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
6740: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
6750: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
6760: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
6770: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
6780: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
6790: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
67a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
67b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
67c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
67d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
67e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
67f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
6800: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
6810: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
6820: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
6830: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
6840: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
6850: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
6860: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
6870: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6880: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
6890: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
68a0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
68b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
68c0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
68d0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
68e0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
68f0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
6900: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
6910: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
6920: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6930: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
6940: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
6950: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
6960: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
6970: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
6980: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
6990: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
69a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
69b0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
69c0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
69d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
69e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
69f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6a00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
6a10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
6a20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
6a30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
6a40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
6a50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6a60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
6a70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
6a80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
6a90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6aa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
6ab0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
6ac0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
6ad0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
6ae0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
6af0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
6b00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6b10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
6b20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
6b30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
6b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
6b50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6b70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
6b80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
6bc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
6bd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
6be0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
6bf0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
6c00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
6c10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
6c20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
6c30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6c40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
6c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
6c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
6ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
6cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
6d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
6d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
6d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
6da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
6db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
6dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
6e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
6e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
6e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
6ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
6eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
6ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
6f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
6f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
6f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
6fb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
6fc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6fd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6ff0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7000: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
7010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
7020: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
7030: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7040: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
7050: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
7060: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
7070: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
7080: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
7090: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
70a0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
70b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
70c0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
70d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
70e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
70f0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
7100: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
7110: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
7120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7130: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
7140: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7150: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
7160: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
7170: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7180: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
7190: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
71a0: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
71b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
71c0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
71d0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
71e0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
71f0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
7200: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
7210: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
7220: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
7230: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
7240: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
7250: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
7260: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
7270: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
7280: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
7290: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
72a0: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
72b0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
72c0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
72d0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
72e0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
72f0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
7300: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
7310: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
7320: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
7330: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
7340: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7360: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
7370: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
7380: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
7390: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
73a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
73b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
73c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
73d0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
73e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
73f0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
7400: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7410: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
7420: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
7440: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
7460: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
7470: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
7480: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
7490: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
74a0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
74b0: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
74c0: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
74d0: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
74e0: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
74f0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
7500: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
7510: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
7520: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
7530: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
7540: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
7550: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
7560: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
7570: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
7580: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
7590: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
75a0: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
75b0: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
75c0: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
75d0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
75e0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
75f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7600: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
7610: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
7620: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
7630: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
7640: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
7650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7660: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
7670: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
7680: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
7690: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
76a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
76c0: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
76d0: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
76e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
76f0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
7700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7710: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
7720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7730: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
7740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
7750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
7760: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
7770: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
7780: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
7790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
77a0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
77b0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
77c0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
77d0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
77e0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
77f0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
7800: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
7810: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
7820: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
7830: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
7840: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
7850: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
7860: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
7870: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
7880: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
7890: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
78a0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
78b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
78c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
78d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78e0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
78f0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
7900: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
7910: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
7920: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
7930: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
7940: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7950: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7960: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
7970: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7980: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
7990: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
79a0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
79b0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
79c0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
79d0: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
79e0: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
79f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7a00: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
7a10: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
7a20: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
7a30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7a40: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
7a50: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
7a60: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
7a70: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
7a80: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
7a90: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
7aa0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
7ab0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
7ac0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7ad0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
7ae0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
7af0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
7b00: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
7b10: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
7b20: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
7b30: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
7b40: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
7b50: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
7b60: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
7b70: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
7b80: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
7b90: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
7ba0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
7bb0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
7bc0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
7bd0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
7be0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
7bf0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
7c00: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
7c10: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
7c20: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
7c30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7c40: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
7c50: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
7c60: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
7c70: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
7c80: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
7c90: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
7ca0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
7cb0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
7cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
7cd0: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
7ce0: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
7cf0: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
7d00: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
7d10: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
7d20: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
7d30: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
7d40: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
7d50: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
7d60: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
7d70: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
7d80: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
7d90: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
7da0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
7db0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7dc0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
7dd0: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
7de0: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
7df0: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
7e00: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
7e10: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
7e20: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
7e30: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
7e40: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
7e50: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
7e60: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
7e70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
7e80: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
7e90: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
7ea0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
7eb0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
7ec0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
7ed0: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
7ee0: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
7ef0: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
7f00: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
7f10: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
7f20: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
7f30: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
7f40: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
7f50: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
7f60: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
7f70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
7f80: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
7f90: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
7fa0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
7fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7fc0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7fd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
7fe0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
7ff0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
8000: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
8010: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
8020: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
8030: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8040: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8050: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
8060: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
8070: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
8080: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
8090: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
80a0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
80b0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
80c0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
80d0: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
80e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
80f0: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
8100: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
8110: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
8120: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
8130: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
8140: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
8150: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
8160: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
8170: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
8180: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
8190: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
81a0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
81b0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
81c0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
81d0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
81e0: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
81f0: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
8200: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
8210: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
8220: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
8230: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
8240: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
8250: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
8260: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
8270: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
8280: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
8290: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
82a0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
82b0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
82c0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
82d0: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
82e0: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
82f0: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
8300: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
8310: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
8320: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8330: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8340: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
8350: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
8360: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8370: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
8380: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
8390: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
83a0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
83b0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
83c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
83d0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
83e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
83f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8400: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
8410: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
8420: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
8430: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
8440: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
8450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
8460: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
8470: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
8480: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
84a0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
84b0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
84c0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
84d0: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
84e0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
84f0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
8500: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
8510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8520: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
8530: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
8540: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
8550: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
8560: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
8570: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
8580: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
8590: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
85a0: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
85b0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
85c0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
85d0: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
85e0: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
85f0: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
8600: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
8610: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
8620: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
8630: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
8640: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8650: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
8660: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
8670: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
8680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
8690: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
86a0: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
86b0: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
86c0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
86e0: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
86f0: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
8700: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
8710: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
8720: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
8730: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
8740: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
8750: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
8760: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
8770: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8780: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
87b0: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
87c0: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
87d0: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
87e0: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
87f0: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
8800: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8810: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
8820: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
8830: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
8840: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
8860: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
8870: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
8880: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
8890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
88a0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
88b0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
88c0: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
88d0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
88e0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
88f0: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
8900: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
8910: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
8920: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
8930: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8940: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8950: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
8960: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
8970: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
8980: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
8990: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
89a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
89b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
89c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
89d0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
89e0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
89f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8a00: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
8a10: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
8a20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
8a40: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
8a50: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
8a60: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
8a70: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
8a80: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
8a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
8aa0: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
8ab0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
8ac0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
8ad0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
8ae0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
8af0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8b00: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
8b10: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
8b20: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
8b30: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
8b40: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
8b50: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
8b60: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
8b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
8b80: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8b90: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
8ba0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
8bb0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
8bc0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
8bd0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
8be0: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
8bf0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
8c00: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8c10: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
8c20: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
8c30: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
8c40: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
8c50: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
8c60: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
8c70: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
8c80: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
8c90: 53 69 6d 28 34 31 30 29 20 29 7b 0a 20 20 20 20  Sim(410) ){.    
8ca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
8cb0: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
8cc0: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
8cd0: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
8ce0: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
8cf0: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
8d00: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
8d10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
8d20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
8d30: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
8d40: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
8d50: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
8d60: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8d70: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
8d80: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
8d90: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
8da0: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
8db0: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
8dc0: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
8dd0: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
8de0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8df0: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
8e00: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
8e10: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
8e20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8e30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
8e40: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
8e50: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
8e60: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
8e70: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
8e80: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
8e90: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8ea0: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
8eb0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
8ec0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
8ed0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
8ee0: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
8ef0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
8f00: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
8f10: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
8f20: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
8f30: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
8f40: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
8f50: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
8f60: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
8f70: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
8f80: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
8f90: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
8fa0: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
8fb0: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
8fc0: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
8fd0: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
8fe0: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
8ff0: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
9000: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
9010: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
9020: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
9030: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
9040: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
9050: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
9060: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
9070: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
9080: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
9090: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
90a0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
90b0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
90c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
90d0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
90e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
90f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
9100: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
9110: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
9120: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
9130: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
9140: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
9150: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
9160: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
9170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
9180: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
9190: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
91a0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
91b0: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
91c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
91d0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
91e0: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
91f0: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
9200: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
9210: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
9220: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
9230: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
9240: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
9250: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
9260: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
9270: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
9280: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
9290: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
92a0: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
92b0: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
92c0: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
92d0: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
92e0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
92f0: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
9300: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
9310: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
9320: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
9330: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
9340: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
9350: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
9360: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
9370: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
9380: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
9390: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
93a0: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
93b0: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
93c0: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
93d0: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
93e0: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
93f0: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
9400: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
9410: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
9420: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
9430: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
9440: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
9450: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
9460: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
9470: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
9480: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
9490: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
94a0: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
94b0: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
94c0: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
94d0: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
94e0: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
94f0: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
9500: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
9510: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
9520: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
9530: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
9540: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
9550: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
9560: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
9570: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
9580: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
9590: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
95a0: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
95b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
95c0: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
95d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
95e0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
95f0: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
9600: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
9610: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
9620: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
9630: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
9640: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
9650: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
9660: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
9670: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
9680: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
9690: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
96a0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
96b0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
96c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
96d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
96e0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
96f0: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
9700: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
9710: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
9720: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
9730: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
9740: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
9750: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
9760: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
9770: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
9780: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
9790: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
97a0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
97b0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
97c0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
97d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
97e0: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
97f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
9800: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
9810: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
9820: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
9830: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
9840: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
9850: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
9860: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
9870: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
9880: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
9890: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
98a0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
98b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
98c0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
98d0: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
98e0: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
98f0: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
9900: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
9910: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
9920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9930: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
9940: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
9950: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
9960: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
9970: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
9980: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
9990: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
99a0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
99b0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
99c0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
99d0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
99e0: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
99f0: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
9a00: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
9a10: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
9a20: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
9a30: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
9a40: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
9a50: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
9a60: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
9a70: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
9a80: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
9a90: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
9aa0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
9ab0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
9ac0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
9ad0: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
9ae0: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
9af0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9b00: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
9b10: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
9b20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
9b30: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
9b40: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
9b50: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
9b60: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
9b70: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
9b80: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
9b90: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
9ba0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
9bb0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
9bc0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
9bd0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
9be0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
9bf0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
9c00: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
9c10: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
9c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
9c30: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
9c40: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
9c50: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
9c60: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
9c70: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
9c80: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
9c90: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
9ca0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
9cb0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
9cc0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
9cd0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
9ce0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
9cf0: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
9d00: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
9d10: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
9d20: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
9d30: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
9d40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9d50: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
9d60: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
9d70: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
9d80: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
9d90: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
9da0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
9db0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
9dc0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
9dd0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
9de0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
9df0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
9e00: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
9e10: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
9e20: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
9e30: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
9e40: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
9e50: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
9e60: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9e70: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
9e80: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
9e90: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
9ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
9eb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9ec0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
9ed0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
9ee0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
9ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6e  page number is n
9f00: 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 61 20  ever added to a 
9f10: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
9f20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
9f30: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
9f40: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
9f50: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
9f60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9f70: 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
9f80: 20 69 66 28 20 70 42 74 2d 3e 70 4d 61 70 20 29   if( pBt->pMap )
9f90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 62 74 72  {.    *pRC = btr
9fa0: 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28 70 42  eePtrmapStore(pB
9fb0: 74 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  t, key, eType, p
9fc0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75  arent);.    retu
9fd0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
9fe0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
9ff0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
a000: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
a010: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
a020: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a030: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
a040: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
a050: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
a060: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
a070: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
a080: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
a090: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
a0a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a0b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
a0c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
a0d0: 20 7d 0a 20 20 69 66 28 20 28 28 63 68 61 72 2a   }.  if( ((char*
a0e0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
a0f0: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 29 5b  Extra(pDbPage))[
a100: 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  0]!=0 ){.    /* 
a110: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
a120: 66 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  f the extra data
a130: 20 69 73 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   is the MemPage.
a140: 69 73 49 6e 69 74 20 62 79 74 65 2e 0a 20 20 20  isInit byte..   
a150: 20 2a 2a 20 49 66 20 74 68 61 74 20 62 79 74 65   ** If that byte
a160: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
a170: 73 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  s this page is a
a180: 6c 73 6f 20 62 65 69 6e 67 20 75 73 65 64 0a 20  lso being used. 
a190: 20 20 20 2a 2a 20 61 73 20 61 20 62 74 72 65 65     ** as a btree
a1a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 2a 70   page. */.    *p
a1b0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
a1c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
a1d0: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
a1e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
a1f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
a200: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
a210: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
a220: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
a230: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a240: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
a250: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
a260: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
a270: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
a280: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
a290: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
a2a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
a2b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
a2c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
a2d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
a2e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
a2f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
a300: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
a310: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
a320: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
a330: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
a340: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
a350: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
a360: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
a370: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
a390: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
a3a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
a3b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
a3c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
a3d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
a3e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
a3f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
a400: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
a410: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
a420: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
a430: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
a440: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
a450: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
a460: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
a470: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
a480: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
a490: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
a4a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
a4b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
a4c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
a4d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
a4e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
a4f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
a500: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
a510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a520: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
a530: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
a540: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
a550: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
a560: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
a570: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
a580: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
a590: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
a5a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
a5b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
a5c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
a5d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
a5e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
a5f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
a600: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
a610: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
a620: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
a630: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
a640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a650: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
a660: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
a670: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
a680: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
a690: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
a6a0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
a6b0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
a6c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a6d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a6e0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
a6f0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
a700: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
a710: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
a720: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
a730: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
a740: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
a750: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
a760: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
a770: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
a780: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a790: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a7a0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
a7b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
a7c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
a7d0: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
a7e0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
a7f0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
a800: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
a810: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
a820: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
a830: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
a840: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
a850: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
a860: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
a870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a880: 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a  _PGNO(iPtrmap);.
a890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a8a0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
a8b0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
a8c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a8d0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
a8e0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
a8f0: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
a900: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
a910: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
a920: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
a930: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 7a 2c 20  vflPtr(x, y, z, 
a940: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
a950: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
a960: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
a970: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
a980: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
a990: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
a9a0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
a9b0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
a9c0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
a9d0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
a9e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
a9f0: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
aa00: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
aa10: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
aa20: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
aa30: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
aa40: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
aa50: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
aa60: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
aa70: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
aa80: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
aa90: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
aaa0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
aab0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
aac0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
aad0: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
aae0: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
aaf0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
ab00: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
ab10: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
ab20: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
ab30: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
ab40: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
ab50: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
ab60: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
ab70: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
ab80: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
ab90: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
aba0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
abb0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
abc0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
abd0: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
abe0: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
abf0: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
ac00: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
ac10: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
ac20: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
ac30: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
ac40: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
ac50: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
ac60: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
ac70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
ac80: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
ac90: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
aca0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
acb0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
acc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
acd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
ace0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
acf0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
ad00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
ad10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
ad20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
ad30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
ad40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
ad50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
ad60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
ad70: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
ad80: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
ad90: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
ada0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
adb0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
adc0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
add0: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
ade0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
adf0: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
ae00: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
ae10: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
ae20: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
ae30: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
ae40: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
ae50: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
ae60: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
ae70: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
ae80: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
ae90: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
aea0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
aeb0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
aec0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
aed0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
aee0: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
aef0: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
af00: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
af10: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
af20: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
af30: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
af40: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
af50: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
af60: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
af70: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
af80: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
af90: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
afa0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
afb0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
afc0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
afd0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
afe0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
aff0: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
b000: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
b010: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
b020: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
b030: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
b040: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
b050: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
b060: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
b070: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
b080: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
b090: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
b0a0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
b0b0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
b0c0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
b0d0: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
b0e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
b0f0: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
b100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b110: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
b120: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
b130: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
b140: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
b150: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
b160: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
b170: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
b180: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
b190: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
b1a0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
b1b0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
b1c0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
b1d0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
b1e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
b1f0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
b200: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
b210: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
b220: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
b230: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
b240: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
b250: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
b260: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
b270: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
b280: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
b290: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
b2a0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
b2b0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
b2c0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
b2d0: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
b2e0: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
b2f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
b300: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
b310: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
b320: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
b330: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
b340: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
b350: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
b360: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b370: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
b380: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
b390: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
b3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
b3b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b3c0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
b3d0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
b3e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
b3f0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
b400: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
b410: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
b420: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
b430: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
b440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b450: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b460: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b470: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b480: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
b490: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
b4a0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
b4b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
b4c0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
b4d0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b4e0: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
b4f0: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
b500: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
b510: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
b520: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
b530: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
b540: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
b550: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
b560: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
b570: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
b580: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
b590: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
b5a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
b5b0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
b5c0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
b5d0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
b5e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
b5f0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
b600: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
b610: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
b620: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
b630: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
b640: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
b650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
b660: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
b670: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
b680: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
b690: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b6a0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
b6b0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
b6c0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
b6d0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
b6e0: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
b6f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b700: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b710: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b730: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
b740: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
b750: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b760: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
b770: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b780: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
b790: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
b7a0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
b7b0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
b7c0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
b7d0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
b7e0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
b7f0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
b800: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
b810: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
b820: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
b830: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
b840: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
b850: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
b860: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
b870: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
b880: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
b890: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
b8a0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
b8b0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
b8c0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
b8d0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
b8e0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
b8f0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
b900: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
b910: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
b920: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
b930: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
b940: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
b950: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
b960: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
b970: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
b980: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
b990: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
b9a0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
b9b0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
b9c0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
b9d0: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
b9e0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
b9f0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
ba00: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
ba10: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
ba20: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
ba30: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
ba40: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
ba50: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
ba60: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
ba70: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
ba80: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
ba90: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
baa0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
bab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bac0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bad0: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
bae0: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
baf0: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
bb00: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
bb10: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
bb20: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
bb30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
bb40: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
bb50: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
bb60: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
bb70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
bb80: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
bb90: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
bba0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
bbb0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
bbc0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
bbd0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
bbe0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
bbf0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
bc00: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
bc10: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
bc20: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
bc30: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
bc40: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
bc50: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
bc60: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
bc70: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
bc80: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
bc90: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
bca0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
bcb0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
bcc0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
bcd0: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
bce0: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
bcf0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
bd00: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
bd10: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
bd20: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
bd30: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
bd40: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
bd50: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd70: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
bd80: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
bd90: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
bda0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
bdb0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
bdc0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
bdd0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
bde0: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
bdf0: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
be00: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
be10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
be20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
be30: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
be40: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
be50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
be60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
be70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
be80: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
be90: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
bea0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
beb0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
bec0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
bed0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
bee0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
bef0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
bf00: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
bf10: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
bf20: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
bf30: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
bf40: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
bf50: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
bf60: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
bf70: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
bf80: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
bf90: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
bfa0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
bfb0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
bfc0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
bfd0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
bfe0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
bff0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
c000: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
c010: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
c020: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
c030: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
c040: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
c050: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
c060: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
c070: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
c080: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
c090: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
c0a0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
c0b0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
c0c0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
c0d0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
c0e0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
c0f0: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
c100: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
c110: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
c120: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
c130: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c140: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
c150: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
c160: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
c170: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
c180: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
c190: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
c1a0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
c1b0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
c1c0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
c1d0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
c1e0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
c1f0: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
c200: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
c210: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
c220: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
c230: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
c240: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
c250: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
c260: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
c270: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
c280: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
c290: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
c2a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
c2b0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
c2c0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
c2d0: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
c2e0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
c2f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
c300: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
c310: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
c320: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
c330: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
c340: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
c350: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
c360: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
c370: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
c380: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
c390: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
c3a0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
c3b0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
c3c0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
c3d0: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
c3e0: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
c3f0: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
c400: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
c410: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
c420: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
c430: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
c440: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
c450: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
c460: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
c470: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
c480: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
c490: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
c4a0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
c4b0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
c4c0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
c4d0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
c4e0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
c4f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
c500: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
c510: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
c520: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
c530: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
c540: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
c570: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
c580: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c5b0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
c5c0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
c5d0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
c5e0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c5f0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
c600: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
c610: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
c620: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
c630: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
c640: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
c650: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
c660: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
c670: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
c680: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c690: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
c6a0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
c6b0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
c6c0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
c6d0: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
c6e0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
c6f0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
c700: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
c710: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
c720: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
c730: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
c740: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
c750: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
c760: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
c770: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
c780: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
c790: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
c7a0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
c7b0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
c7c0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
c7d0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
c7e0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
c7f0: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
c800: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
c810: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
c820: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
c830: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
c840: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
c850: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
c860: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
c870: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
c880: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
c890: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
c8a0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
c8b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c8c0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
c8d0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
c8e0: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
c8f0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
c900: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c910: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
c920: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
c930: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
c940: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
c950: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
c960: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
c970: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c980: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
c990: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
c9a0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
c9b0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
c9c0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
c9d0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
c9e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
c9f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
ca00: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
ca10: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
ca20: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ca30: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
ca40: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
ca50: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
ca60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca70: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
ca80: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
ca90: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
caa0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
cab0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
cac0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
cad0: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
cae0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
caf0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
cb00: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
cb10: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
cb20: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
cb30: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
cb40: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
cb50: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
cb60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
cb70: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
cb80: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
cb90: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
cba0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
cbb0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
cbc0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
cbd0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
cbe0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
cbf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
cc00: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
cc10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
cc30: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
cc40: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
cc50: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
cc60: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
cc70: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
cc80: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
cc90: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
cca0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
ccb0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
ccc0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
ccd0: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
cce0: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
ccf0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
cd00: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
cd10: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
cd20: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
cd30: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
cd40: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
cd50: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
cd60: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
cd70: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
cd80: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
cd90: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
cda0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
cdb0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
cdc0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
cdd0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
cde0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
cdf0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
ce00: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
ce10: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
ce20: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
ce30: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
ce40: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
ce50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
ce60: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
ce70: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
ce80: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
ce90: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
cea0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
ceb0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
cec0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
ced0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
cee0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
cef0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
cf00: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
cf10: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
cf20: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
cf30: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
cf40: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  CUUM./*.** The c
cf50: 65 6c 6c 20 70 43 65 6c 6c 20 69 73 20 63 75 72  ell pCell is cur
cf60: 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70  rently part of p
cf70: 61 67 65 20 70 53 72 63 20 62 75 74 20 77 69 6c  age pSrc but wil
cf80: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 20  l ultimately be 
cf90: 70 61 72 74 0a 2a 2a 20 6f 66 20 70 50 61 67 65  part.** of pPage
cfa0: 2e 20 20 28 70 53 72 63 20 61 6e 64 20 70 50 61  .  (pSrc and pPa
cfb0: 67 65 72 20 61 72 65 20 6f 66 74 65 6e 20 74 68  ger are often th
cfc0: 65 20 73 61 6d 65 2e 29 20 20 49 66 20 70 43 65  e same.)  If pCe
cfd0: 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  ll contains a.**
cfe0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
cff0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
d000: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
d010: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
d020: 61 70 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6f 76  ap for.** the ov
d030: 65 72 66 6c 6f 77 20 70 61 67 65 20 74 68 61 74  erflow page that
d040: 20 77 69 6c 6c 20 62 65 20 76 61 6c 69 64 20 61   will be valid a
d050: 66 74 65 72 20 70 43 65 6c 6c 20 68 61 73 20 62  fter pCell has b
d060: 65 65 6e 20 6d 6f 76 65 64 20 74 6f 20 70 50 61  een moved to pPa
d070: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
d080: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
d090: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
d0a0: 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 53 72  ge, MemPage *pSr
d0b0: 63 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 69 6e 74  c, u8 *pCell,int
d0c0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
d0d0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
d0e0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
d0f0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
d100: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
d110: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
d120: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
d130: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
d140: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
d150: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a  .    Pgno ovfl;.
d160: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57      if( SQLITE_W
d170: 49 54 48 49 4e 28 70 53 72 63 2d 3e 61 44 61 74  ITHIN(pSrc->aDat
d180: 61 45 6e 64 2c 20 70 43 65 6c 6c 2c 20 70 43 65  aEnd, pCell, pCe
d190: 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  ll+info.nLocal) 
d1a0: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
d1b0: 65 28 20 70 53 72 63 21 3d 70 50 61 67 65 20 29  e( pSrc!=pPage )
d1c0: 3b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 53  ;.      *pRC = S
d1d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d1e0: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
d1f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 76 66 6c  ;.    }.    ovfl
d200: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
d210: 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d  ll[info.nSize-4]
d220: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
d230: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
d240: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
d250: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
d260: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
d270: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
d280: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
d290: 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75   given. This rou
d2a0: 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73  tine reorganizes
d2b0: 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68   cells within th
d2c0: 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61  e.** page so tha
d2d0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
d2e0: 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68  ree-blocks on th
d2f0: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73  e free-block lis
d300: 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
d310: 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74  er nMaxFrag is t
d320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
d330: 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  t of fragmented 
d340: 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62  space that may b
d350: 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  e.** present in 
d360: 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74  the page after t
d370: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d380: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rns..**.** EVIDE
d390: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
d3a0: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
d3b0: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
d3c0: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
d3d0: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
d3e0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
d3f0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
d400: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
d410: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
d420: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
d430: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
d440: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
d450: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
d460: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
d470: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
d480: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
d490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
d4a0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
d4b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d4c0: 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69  t nMaxFrag){.  i
d4d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d4f0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
d500: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
d510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d520: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
d530: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
d540: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
d550: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
d560: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
d570: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
d580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d590: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
d5a0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
d5b0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
d5c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d5d0: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
d5e0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
d5f0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
d600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
d610: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
d620: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
d630: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d650: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
d660: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
d670: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
d6a0: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
d6b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d6c0: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
d6d0: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
d6e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d6f0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
d700: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
d710: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
d720: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d730: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
d740: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
d750: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
d760: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
d770: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
d780: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
d790: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
d7a0: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
d7b0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d7c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
d7d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d7e0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d7f0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d800: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d810: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d830: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d840: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
d850: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
d860: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
d870: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
d880: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d890: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d8a0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d8b0: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
d8c0: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
d8d0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
d8e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
d8f0: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
d900: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
d910: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
d920: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
d930: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
d940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
d950: 72 2b 33 5d 29 20 7c 7c 20 43 4f 52 52 55 50 54  r+3]) || CORRUPT
d960: 5f 44 42 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69  _DB );.  iCellFi
d970: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
d980: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73   + 2*nCell;.  us
d990: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
d9a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d9b0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  e;..  /* This bl
d9c0: 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65  ock handles page
d9d0: 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65  s with two or fe
d9e0: 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  wer free blocks 
d9f0: 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a  and nMaxFrag.  *
da00: 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d  * or fewer fragm
da10: 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20  ented bytes. In 
da20: 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
da30: 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74  faster to move t
da40: 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20  he.  ** two (or 
da50: 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63  one) blocks of c
da60: 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f  ells using memmo
da70: 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68 65  ve() and add the
da80: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f   required.  ** o
da90: 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20 70  ffsets to each p
daa0: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65  ointer in the ce
dab0: 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
dac0: 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a   than it is to .
dad0: 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74    ** reconstruct
dae0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
daf0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74  .  */.  if( (int
db00: 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d  )data[hdr+7]<=nM
db10: 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e  axFrag ){.    in
db20: 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62 79  t iFree = get2by
db30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
db40: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 3e  ;.    if( iFree>
db50: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72  usableSize-4 ) r
db60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
db70: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
db80: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 20  ;.    if( iFree 
db90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 72  ){.      int iFr
dba0: 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  ee2 = get2byte(&
dbb0: 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 20 20  data[iFree]);.  
dbc0: 20 20 20 20 69 66 28 20 69 46 72 65 65 32 3e 75      if( iFree2>u
dbd0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72 65  sableSize-4 ) re
dbe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dbf0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
dc00: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
dc10: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
dc20: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
dc30: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
dc40: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
dc50: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
dc60: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
dc70: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
dc80: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
dc90: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
dca0: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
dcb0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
dcc0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
dcd0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
dce0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
dcf0: 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e 3d         if( top>=
dd00: 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  iFree ){.       
dd10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd20: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
dd30: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
dd40: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
dd50: 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e2 ){.          
dd60: 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72  if( iFree+sz>iFr
dd70: 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ee2 ) return SQL
dd80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
dd90: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
dda0: 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74     sz2 = get2byt
ddb0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32  e(&data[iFree2+2
ddc0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
ddd0: 28 20 69 46 72 65 65 32 2b 73 7a 32 20 3e 20 75  ( iFree2+sz2 > u
dde0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
ddf0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
de00: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
de10: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
de20: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
de30: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
de40: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
de50: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
de60: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
de70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
de80: 28 20 69 46 72 65 65 2b 73 7a 3e 75 73 61 62 6c  ( iFree+sz>usabl
de90: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
dea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
deb0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
dec0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
ded0: 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d 20  .        cbrk = 
dee0: 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20  top+sz;.        
def0: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69 46  assert( cbrk+(iF
df00: 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62  ree-top) <= usab
df10: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
df20: 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
df30: 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70  cbrk], &data[top
df40: 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20  ], iFree-top);. 
df50: 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64 72         for(pAddr
df60: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
df70: 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b 20  t]; pAddr<pEnd; 
df80: 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20  pAddr+=2){.     
df90: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
dfa0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 20  te(pAddr);.     
dfb0: 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72 65       if( pc<iFre
dfc0: 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41  e ){ put2byte(pA
dfd0: 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20  ddr, pc+sz); }. 
dfe0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
dff0: 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20 70  ( pc<iFree2 ){ p
e000: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
e010: 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20  c+sz2); }.      
e020: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
e030: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b   defragment_out;
e040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e050: 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73 61   }..  cbrk = usa
e060: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
e070: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
e080: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
e090: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
e0a0: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
e0b0: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
e0c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
e0d0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
e0e0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
e0f0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
e100: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
e110: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
e120: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
e130: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
e140: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
e150: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
e160: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
e170: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
e180: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
e190: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52  e().    ** if PR
e1a0: 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63  AGMA cell_size_c
e1b0: 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a  heck=ON..    */.
e1c0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
e1d0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
e1e0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
e1f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e200: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
e210: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
e220: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
e230: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
e240: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
e250: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
e260: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
e270: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
e280: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
e290: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
e2a0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
e2b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
e2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e2d0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
e2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e2f0: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
e300: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
e310: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
e320: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62      testcase( cb
e330: 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  rk+size==usableS
e340: 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ize );.    testc
e350: 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73  ase( pc+size==us
e360: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
e370: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
e380: 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74  cbrk);.    if( t
e390: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
e3a0: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28  int x;.      if(
e3b0: 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74   cbrk==pc ) cont
e3c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70  inue;.      temp
e3d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
e3e0: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
e3f0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
e400: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
e410: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
e420: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65        memcpy(&te
e430: 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c  mp[x], &data[x],
e440: 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78   (cbrk+size) - x
e450: 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74  );.      src = t
e460: 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  emp;.    }.    m
e470: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
e480: 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a  ], &src[pc], siz
e490: 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  e);.  }.  data[h
e4a0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66  dr+7] = 0;.. def
e4b0: 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 61  ragment_out:.  a
e4c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
e4d0: 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ree>=0 );.  if( 
e4e0: 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b  data[hdr+7]+cbrk
e4f0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
e500: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
e510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e520: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
e530: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
e540: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
e550: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
e560: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
e570: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
e580: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
e590: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+2] = 0;.  me
e5a0: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
e5b0: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
e5c0: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
e5d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e5e0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e5f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e600: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e610: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e620: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
e630: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
e640: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
e650: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
e660: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
e670: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
e680: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
e690: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
e6a0: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
e6b0: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
e6c0: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
e6d0: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
e6e0: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
e6f0: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
e700: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
e710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
e720: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
e730: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
e740: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
e750: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
e760: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
e770: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
e780: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
e790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
e7a0: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
e7b0: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
e7c0: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
e7d0: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
e7e0: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
e7f0: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
e800: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
e810: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
e820: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
e830: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
e840: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
e850: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
e860: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
e870: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
e880: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
e890: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
e8a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
e8b0: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
e8c0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
e8d0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
e8e0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
e8f0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
e900: 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
e910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
e920: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69   data */.  int i
e930: 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 20  Addr = hdr + 1; 
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e960: 20 6f 66 20 70 74 72 20 74 6f 20 70 63 20 2a 2f   of ptr to pc */
e970: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
e980: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
e990: 72 5d 29 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  r]);          /*
e9a0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
e9b0: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74  ee slot */.  int
e9c0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 65 73          /* Exces
e9f0: 73 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 6c  s size of the sl
ea00: 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 50  ot */.  int maxP
ea10: 43 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  C = pPg->pBt->us
ea20: 61 62 6c 65 53 69 7a 65 20 2d 20 6e 42 79 74 65  ableSize - nByte
ea30: 3b 20 20 2f 2a 20 4d 61 78 20 61 64 64 72 65 73  ;  /* Max addres
ea40: 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20 73  s for a usable s
ea50: 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  lot */.  int siz
ea60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ea90: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
eaa0: 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20  .  assert( pc>0 
eab0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c 3d  );.  while( pc<=
eac0: 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 2f 2a 20  maxPC ){.    /* 
ead0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
eae0: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
eaf0: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
eb00: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
eb10: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
eb20: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
eb30: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
eb40: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
eb50: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
eb60: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
eb70: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
eb80: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
eb90: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
eba0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
ebb0: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
ebc0: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
ebd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ebe0: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
ebf0: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
ec00: 0a 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29  .      if( x<4 )
ec10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
ec20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
ec30: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
ec40: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
ec50: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
ec60: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
ec70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
ec80: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
ec90: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
eca0: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
ecb0: 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75  hdr+7]>57 ) retu
ecc0: 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rn 0;..        /
ecd0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
ece0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
ecf0: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
ed00: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
ed10: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
ed20: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
ed30: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
ed40: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
ed50: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
ed60: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
ed70: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
ed80: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
ed90: 6c 73 65 20 69 66 28 20 78 2b 70 63 20 3e 20 6d  lse if( x+pc > m
eda0: 61 78 50 43 20 29 7b 0a 20 20 20 20 20 20 20 20  axPC ){.        
edb0: 2f 2a 20 54 68 69 73 20 73 6c 6f 74 20 65 78 74  /* This slot ext
edc0: 65 6e 64 73 20 6f 66 66 20 74 68 65 20 65 6e 64  ends off the end
edd0: 20 6f 66 20 74 68 65 20 75 73 61 62 6c 65 20 70   of the usable p
ede0: 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  art of the page 
edf0: 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  */.        *pRc 
ee00: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
ee10: 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20  _PAGE(pPg);.    
ee20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ee30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee40: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
ee50: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
ee60: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
ee70: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
ee80: 75 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  unt.        ** f
ee90: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
eea0: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
eeb0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
eec0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
eed0: 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  aData[pc+2], x);
eee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
eef0: 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20  eturn &aData[pc 
ef00: 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + x];.    }.    
ef10: 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20  iAddr = pc;.    
ef20: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
ef30: 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69  Data[pc]);.    i
ef40: 66 28 20 70 63 3c 3d 69 41 64 64 72 2b 73 69 7a  f( pc<=iAddr+siz
ef50: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
ef60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
ef70: 54 68 65 20 6e 65 78 74 20 73 6c 6f 74 20 69 6e  The next slot in
ef80: 20 74 68 65 20 63 68 61 69 6e 20 69 73 20 6e 6f   the chain is no
ef90: 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  t past the end o
efa0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 6c  f the current sl
efb0: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70  ot */.        *p
efc0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
efd0: 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20  UPT_PAGE(pPg);. 
efe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
eff0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
f000: 0a 20 20 69 66 28 20 70 63 3e 6d 61 78 50 43 2b  .  if( pc>maxPC+
f010: 6e 42 79 74 65 2d 34 20 29 7b 0a 20 20 20 20 2f  nByte-4 ){.    /
f020: 2a 20 54 68 65 20 66 72 65 65 20 73 6c 6f 74 20  * The free slot 
f030: 63 68 61 69 6e 20 65 78 74 65 6e 64 73 20 6f 66  chain extends of
f040: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
f050: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 2a 70 52   page */.    *pR
f060: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
f070: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
f080: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f090: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f0a0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
f0b0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
f0c0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
f0d0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
f0e0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
f0f0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
f100: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
f110: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
f120: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
f130: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
f140: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
f150: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
f160: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
f170: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
f180: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
f190: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
f1a0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
f1b0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
f1c0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
f1d0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
f1e0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
f1f0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
f200: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
f210: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
f220: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
f230: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
f240: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
f250: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
f260: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
f270: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
f280: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
f290: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
f2a0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
f2b0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
f2c0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
f2d0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
f2e0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
f2f0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
f300: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
f310: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
f320: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
f330: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
f340: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
f350: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
f360: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
f370: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f380: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
f390: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
f3a0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
f3b0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
f3c0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
f3d0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
f3e0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
f3f0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
f420: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
f430: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
f440: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f450: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
f460: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
f470: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
f480: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
f490: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
f4a0: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
f4b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
f4c0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
f4d0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
f4e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
f4f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
f500: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
f510: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
f520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
f530: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f550: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
f560: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
f570: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
f580: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
f590: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
f5a0: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
f5b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
f5c0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
f5d0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
f5e0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
f5f0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
f600: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
f610: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
f620: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
f630: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
f640: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
f650: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
f660: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
f670: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
f680: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
f690: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
f6a0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
f6b0: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
f6c0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
f6d0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
f6e0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
f6f0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
f700: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
f710: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
f720: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
f730: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
f740: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
f750: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
f760: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
f770: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
f780: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
f790: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
f7a0: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
f7b0: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
f7c0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
f7d0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
f7e0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
f7f0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
f800: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
f810: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
f820: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 62 79  bleSize ); /* by
f830: 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65   btreeComputeFre
f840: 65 53 70 61 63 65 28 29 20 2a 2f 0a 20 20 69 66  eSpace() */.  if
f850: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
f860: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
f870: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
f880: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
f890: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
f8a0: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
f8b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f8c0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
f8d0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
f8e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
f8f0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
f900: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
f910: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
f920: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2c 0a 20   cell pointer,. 
f930: 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 66   ** and if the f
f940: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
f950: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
f960: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
f970: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
f980: 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  a slot big enoug
f990: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
f9a0: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
f9b0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
f9c0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
f9d0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
f9e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
f9f0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
fa00: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
fa10: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
fa20: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
fa30: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
fa40: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
fa50: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
fa60: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
fa70: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
fa80: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
fa90: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
faa0: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
fab0: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
fac0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
fad0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fae0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
faf0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
fb00: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fb10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
fb20: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
fb30: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
fb40: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
fb50: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
fb60: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
fb70: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
fb80: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
fb90: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
fba0: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
fbb0: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
fbc0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
fbd0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
fbe0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
fbf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fc00: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29  Page->nFree>=0 )
fc10: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
fc20: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c  gmentPage(pPage,
fc30: 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e   MIN(4, pPage->n
fc40: 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29  Free - (2+nByte)
fc50: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
fc60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
fc70: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
fc80: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
fc90: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
fca0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f   gap+2+nByte<=to
fcb0: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
fcc0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
fcd0: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
fce0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
fcf0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
fd00: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
fd10: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
fd20: 54 68 65 20 62 74 72 65 65 43 6f 6d 70 75 74 65  The btreeCompute
fd30: 46 72 65 65 53 70 61 63 65 28 29 20 63 61 6c 6c  FreeSpace() call
fd40: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
fd50: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
fd60: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
fd70: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
fd80: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
fd90: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
fda0: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
fdb0: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
fdc0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
fdd0: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
fde0: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
fdf0: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
fe00: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
fe10: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
fe20: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
fe30: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
fe40: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
fe50: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
fe60: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
fe70: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
fe80: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
fe90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fea0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
feb0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
fec0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
fed0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
fee0: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
fef0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
ff00: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
ff10: 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a  aData[iStart].**
ff20: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
ff30: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53   the block is iS
ff40: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
ff50: 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c   Adjacent freebl
ff60: 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63  ocks are coalesc
ff70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74  ed..**.** Even t
ff80: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
ff90: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
ffa0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 43 6f 6d  cked by btreeCom
ffb0: 70 75 74 65 46 72 65 65 53 70 61 63 65 28 29 2c  puteFreeSpace(),
ffc0: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
ffd0: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
ffe0: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
fff0: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
10000 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
10010 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
10020 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
10030 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
10040 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
10050 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
10060 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
10070 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
10080 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
10090 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
100a0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
100b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
100c0 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
100d0 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
100e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
100f0 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
10100 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
10110 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
10120 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10150 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
10160 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
10170 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
101a0 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
101b0 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
101c0 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
101f0 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
10200 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
10210 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10230 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
10240 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
10250 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
10260 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
10270 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
10280 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
10290 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20  ze */.  u16 x;  
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102c0 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
102d0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
102e0 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
102f0 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
10300 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
10310 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
10320 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
10330 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10340 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
10350 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
10360 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
10370 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
10380 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
10390 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
103a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
103b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
103c0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
103d0 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
103e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
103f0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10400 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
10410 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
10420 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
10430 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
10440 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10450 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
10460 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
10470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
10480 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
10490 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
104a0 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
104b0 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65 2d  ( iStart<=pPage-
104c0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
104d0 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  -4 );..  /* The 
104e0 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
104f0 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
10500 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
10510 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73  Find the .  ** s
10520 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  pot on the list 
10530 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f  where iStart sho
10540 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e  uld be inserted.
10550 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
10560 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
10570 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31    iPtr = hdr + 1
10580 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74  ;.  if( data[iPt
10590 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  r+1]==0 && data[
105a0 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iPtr]==0 ){.    
105b0 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f  iFreeBlk = 0;  /
105c0 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74  * Shortcut for t
105d0 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
105e0 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
105f0 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ty */.  }else{. 
10600 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65     while( (iFree
10610 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
10620 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74  data[iPtr]))<iSt
10630 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
10640 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
10650 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10660 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72  iFreeBlk==0 ) br
10670 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  eak;.        ret
10680 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10690 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
106a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
106b0 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
106c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
106d0 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74  eeBlk>pPage->pBt
106e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
106f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10700 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10710 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
10720 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
10730 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
10740 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
10750 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
10760 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
10770 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
10780 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
10790 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
107a0 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
107b0 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
107c0 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
107d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
107e0 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
107f0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
10800 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
10810 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
10820 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
10830 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
10840 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
10850 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
10860 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
10870 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
10880 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
10890 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
108a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
108b0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
108c0 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20  );.      iEnd = 
108d0 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62  iFreeBlk + get2b
108e0 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
108f0 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  lk+2]);.      if
10900 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e  ( iEnd > pPage->
10910 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10920 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10930 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10940 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
10950 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69 7a      }.      iSiz
10960 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
10970 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
10980 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
10990 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
109a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
109b0 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
109c0 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
109d0 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
109e0 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
109f0 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
10a00 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
10a10 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
10a20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
10a30 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
10a40 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
10a50 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
10a60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10a70 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
10a80 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
10a90 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
10aa0 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
10ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
10ac0 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
10ad0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
10ae0 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
10af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10b00 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10b10 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
10b20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
10b30 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
10b40 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
10b50 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
10b60 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
10b70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10b80 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
10b90 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10ba0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10bb0 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  age);.    data[h
10bc0 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
10bd0 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62 79    }.  x = get2by
10be0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
10bf0 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c 3d  ;.  if( iStart<=
10c00 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  x ){.    /* The 
10c10 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73  new freeblock is
10c20 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
10c30 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  g of the cell co
10c40 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20  ntent area,.    
10c50 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e  ** so just exten
10c60 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
10c70 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74  nt area rather t
10c80 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68  han create anoth
10c90 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69  er.    ** freeli
10ca0 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  st entry */.    
10cb0 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c 20  if( iStart<x || 
10cc0 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
10cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10ce0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10cf0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
10d00 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
10d10 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
10d20 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
10d30 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
10d40 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
10d50 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
10d60 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
10d70 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
10d80 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
10d90 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20   iStart);.  }.  
10da0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
10db0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
10dc0 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
10dd0 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
10de0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
10df0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
10e00 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
10e10 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
10e20 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
10e30 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
10e40 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
10e50 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32  ize);.  }.  put2
10e60 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
10e70 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
10e80 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10e90 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
10ea0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
10eb0 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
10ec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ed0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
10ee0 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
10ef0 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
10f00 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
10f10 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
10f20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
10f30 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
10f40 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
10f50 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
10f60 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
10f70 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
10f80 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
10f90 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
10fa0 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
10fb0 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
10fc0 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
10fd0 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
10fe0 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
10ff0 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
11000 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
11010 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
11020 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
11030 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
11040 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
11050 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
11060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
11070 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
11080 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
11090 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
110a0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
110b0 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
110c0 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
110d0 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
110e0 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
110f0 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
11100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11110 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11120 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
11130 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
11140 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
11150 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
11160 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
11170 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
11180 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
11190 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
111a0 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
111b0 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
111c0 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
111d0 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
111e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
111f0 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
11200 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
11210 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
11220 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
11230 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
11240 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
11250 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
11260 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
11270 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
11280 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
11290 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
112a0 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
112b0 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
112c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
112d0 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
112e0 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
112f0 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
11300 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
11310 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
11320 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
11330 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
11340 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
11350 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
11360 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
11370 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
11380 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
11390 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
113a0 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
113b0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
113c0 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
113d0 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
113e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
113f0 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
11400 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
11410 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
11420 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
11430 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
11440 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
11450 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
11460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
11470 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
11480 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
11490 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
114a0 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
114b0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
114c0 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
114d0 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
114e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
114f0 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
11500 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
11510 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
11520 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
11530 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
11540 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
11550 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
11560 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
11570 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
11580 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
11590 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
115a0 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
115b0 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
115c0 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
115d0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
115e0 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
115f0 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
11600 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
11610 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
11620 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
11630 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
11640 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
11650 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
11660 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
11670 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
11680 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
11690 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
116a0 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
116b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
116c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
116d0 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
116e0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
116f0 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
11700 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
11710 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
11720 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11730 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
11740 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
11750 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
11760 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
11770 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
11780 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11790 43 6f 6d 70 75 74 65 20 74 68 65 20 61 6d 6f 75  Compute the amou
117a0 6e 74 20 6f 66 20 66 72 65 65 73 70 61 63 65 20  nt of freespace 
117b0 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 49 6e  on the page.  In
117c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 69   other words, fi
117d0 6c 6c 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ll.** in the pPa
117e0 67 65 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 2e  ge->nFree field.
117f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11800 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53  treeComputeFreeS
11810 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
11820 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
11830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
11840 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
11850 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
11860 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
11870 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
11880 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
11890 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
118a0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
118b0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
118c0 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
118d0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
118e0 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
118f0 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
11900 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
11910 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ach page */.  in
11920 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
11930 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
11940 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
11950 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
11960 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
11970 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
11980 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
11990 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
119a0 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
119b0 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
119c0 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
119d0 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
119e0 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
119f0 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
11a00 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
11a10 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
11a20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11a30 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
11a40 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
11a50 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
11a60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11a70 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11a80 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11a90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
11aa0 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
11ab0 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
11ac0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
11ad0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
11ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11af0 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
11b00 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
11b10 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
11b20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
11b30 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
11b40 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
11b50 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
11b60 74 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  t==1 );.  assert
11b70 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 30  ( pPage->nFree<0
11b80 20 29 3b 0a 0a 20 20 75 73 61 62 6c 65 53 69 7a   );..  usableSiz
11b90 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
11ba0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 68 64  usableSize;.  hd
11bb0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
11bc0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
11bd0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f  Page->aData;.  /
11be0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11bf0 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
11c00 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
11c10 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
11c20 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68  signates.  ** th
11c30 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
11c40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
11c50 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66  . A zero value f
11c60 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20  or this integer 
11c70 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65  is.  ** interpre
11c80 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f  ted as 65536. */
11c90 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
11ca0 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
11cb0 64 72 2b 35 5d 29 3b 0a 20 20 69 43 65 6c 6c 46  dr+5]);.  iCellF
11cc0 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
11cd0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
11ce0 53 69 7a 65 20 2b 20 32 2a 70 50 61 67 65 2d 3e  Size + 2*pPage->
11cf0 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61  nCell;.  iCellLa
11d00 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
11d10 2d 20 34 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  - 4;..  /* Compu
11d20 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
11d30 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
11d40 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43  age.  ** EVIDENC
11d50 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
11d60 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
11d70 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11d80 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
11d90 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
11da0 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
11db0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72   on the page, or
11dc0 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72   is zero if ther
11dd0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72  e are no.  ** fr
11de0 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70  eeblocks. */.  p
11df0 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
11e00 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46  ta[hdr+1]);.  nF
11e10 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
11e20 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
11e30 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
11e40 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
11e50 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e  ace */.  if( pc>
11e60 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78  0 ){.    u32 nex
11e70 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  t, size;.    if(
11e80 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29   pc<iCellFirst )
11e90 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
11ea0 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
11eb0 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
11ec0 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
11ed0 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
11ee0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
11ef0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
11f00 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
11f10 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
11f20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      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 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
11f50 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  ; .    }.    whi
11f60 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
11f70 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  f( pc>iCellLast 
11f80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
11f90 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20  eeblock off the 
11fa0 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
11fb0 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
11fc0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11fd0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
11fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
11ff0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
12000 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
12010 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
12020 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
12030 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
12040 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  + size;.      if
12050 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  ( next<=pc+size+
12060 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
12070 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
12080 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30  }.    if( next>0
12090 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
120a0 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73  eblock not in as
120b0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
120c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
120d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
120e0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
120f0 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e      if( pc+size>
12100 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73  (unsigned int)us
12110 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
12120 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c    /* Last freebl
12130 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74  ock extends past
12140 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20   page end */.   
12150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12160 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
12170 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
12180 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
12190 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
121a0 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
121b0 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
121c0 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
121d0 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
121e0 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
121f0 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
12200 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74  es within.  ** t
12210 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
12220 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
12230 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
12240 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
12250 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
12260 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
12270 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
12280 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
12290 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20  .  ** serves to 
122a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
122b0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
122c0 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
122d0 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65  content.  ** are
122e0 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
122f0 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
12300 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
12310 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
12320 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69  ( nFree>usableSi
12330 7a 65 20 7c 7c 20 6e 46 72 65 65 3c 69 43 65 6c  ze || nFree<iCel
12340 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 72 65  lFirst ){.    re
12350 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12360 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
12370 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
12380 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
12390 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
123a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
123b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
123c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
123d0 74 79 20 63 68 65 63 6b 20 61 66 74 65 72 20 62  ty check after b
123e0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 69  treeInitPage() i
123f0 66 0a 2a 2a 20 50 52 41 47 4d 41 20 63 65 6c 6c  f.** PRAGMA cell
12400 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 20 0a  _size_check=ON .
12410 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
12420 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
12430 72 65 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b  reeCellSizeCheck
12440 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12450 7b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  {.  int iCellFir
12460 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
12470 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
12480 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
12490 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  et */.  int iCel
124a0 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
124b0 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
124c0 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
124d0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  fset */.  int i;
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
124f0 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
12500 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
12510 79 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20  y */.  int sz;  
12520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
12530 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
12540 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
12550 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
12560 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
12570 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
12580 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
12590 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
125a0 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
125b0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Data */.  int us
125c0 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
125d0 4d 61 78 69 6d 75 6d 20 75 73 61 62 6c 65 20 73  Maximum usable s
125e0 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
125f0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
12600 66 73 65 74 3b 20 20 20 20 2f 2a 20 53 74 61 72  fset;    /* Star
12610 74 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t of cell conten
12620 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 69 43 65  t area */..  iCe
12630 6c 6c 46 69 72 73 74 20 3d 20 70 50 61 67 65 2d  llFirst = pPage-
12640 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
12650 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
12660 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
12670 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
12680 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
12690 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
126a0 34 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  4;.  data = pPag
126b0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63 65 6c 6c  e->aData;.  cell
126c0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
126d0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66  cellOffset;.  if
126e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
126f0 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
12700 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
12710 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
12720 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
12730 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65  Aligned(&data[ce
12740 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a  llOffset+i*2]);.
12750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
12760 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
12770 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
12780 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
12790 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
127a0 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
127b0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
127c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
127d0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
127e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20  .    }.    sz = 
127f0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
12800 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
12810 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ]);.    testcase
12820 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
12830 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
12840 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
12850 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12860 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12870 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
12880 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
12890 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
128a0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
128b0 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
128c0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
128d0 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
128e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
128f0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
12900 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
12910 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
12920 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
12930 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
12940 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
12950 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
12960 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
12970 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
12980 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
12990 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
129a0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
129b0 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
129c0 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
129d0 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
129e0 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
129f0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
12a00 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
12a10 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
12a20 65 29 7b 0a 20 20 75 38 20 2a 64 61 74 61 3b 20  e){.  u8 *data; 
12a30 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
12a40 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
12a50 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
12a60 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
12a70 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
12a80 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 61  tructure */..  a
12a90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
12aa0 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
12ab0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
12ac0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12ad0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12ae0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12af0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
12b00 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
12b10 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
12b20 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
12b30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
12b40 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
12b50 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12b60 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
12b70 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
12b80 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
12b90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
12ba0 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
12bb0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
12bc0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
12bd0 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50  0 );..  pBt = pP
12be0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 64 61 74 61  age->pBt;.  data
12bf0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   = pPage->aData 
12c00 2b 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  + pPage->hdrOffs
12c10 65 74 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  et;.  /* EVIDENC
12c20 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
12c30 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
12c40 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
12c50 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a  0 indicating.  *
12c60 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  * the b-tree pag
12c70 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28  e type. */.  if(
12c80 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
12c90 67 65 2c 20 64 61 74 61 5b 30 5d 29 20 29 7b 0a  ge, data[0]) ){.
12ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12cb0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
12cc0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Page);.  }.  ass
12cd0 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
12ce0 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
12cf0 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
12d00 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
12d10 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
12d20 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
12d30 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
12d40 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
12d50 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70  ->cellOffset = p
12d60 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
12d70 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
12d80 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61  ldPtrSize;.  pPa
12d90 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 64  ge->aCellIdx = d
12da0 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ata + pPage->chi
12db0 6c 64 50 74 72 53 69 7a 65 20 2b 20 38 3b 0a 20  ldPtrSize + 8;. 
12dc0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
12dd0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   = pPage->aData 
12de0 2b 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  + pBt->usableSiz
12df0 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  e;.  pPage->aDat
12e00 61 4f 66 73 74 20 3d 20 70 50 61 67 65 2d 3e 61  aOfst = pPage->a
12e10 44 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68  Data + pPage->ch
12e20 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 2f 2a  ildPtrSize;.  /*
12e30 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
12e40 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20  37002-32774 The 
12e50 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
12e60 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76   at offset 3 giv
12e70 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  es the.  ** numb
12e80 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
12e90 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50  he page. */.  pP
12ea0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
12eb0 32 62 79 74 65 28 26 64 61 74 61 5b 33 5d 29 3b  2byte(&data[3]);
12ec0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
12ed0 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
12ee0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
12ef0 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
12f00 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
12f10 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
12f20 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
12f30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12f40 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
12f50 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
12f60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
12f70 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20  _CELL(pBt) );.  
12f80 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
12f90 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66  R-24089-57979 If
12fa0 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73   a page contains
12fb0 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68   no cells (which
12fc0 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f   is only.  ** po
12fd0 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
12fe0 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
12ff0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
13000 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
13010 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f  e.  ** offset to
13020 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
13030 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
13040 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
13050 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62  minus the.  ** b
13060 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64  ytes of reserved
13070 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73   space. */.  ass
13080 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
13090 6c 3e 30 0a 20 20 20 20 20 20 20 7c 7c 20 67 65  l>0.       || ge
130a0 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
130b0 61 74 61 5b 35 5d 29 3d 3d 28 69 6e 74 29 70 42  ata[5])==(int)pB
130c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 0a 20 20  t->usableSize.  
130d0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
130e0 44 42 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  DB );.  pPage->n
130f0 46 72 65 65 20 3d 20 2d 31 3b 20 20 2f 2a 20 49  Free = -1;  /* I
13100 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 69  ndicate that thi
13110 73 20 76 61 6c 75 65 20 69 73 20 79 65 74 20 75  s value is yet u
13120 6e 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20 70  ncomputed */.  p
13130 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
13140 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d  ;.  if( pBt->db-
13150 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
13160 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
13170 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 43 65    return btreeCe
13180 6c 6c 53 69 7a 65 43 68 65 63 6b 28 70 50 61 67  llSizeCheck(pPag
13190 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
131a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
131b0 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61  *.** Set up a ra
131c0 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69  w page so that i
131d0 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64  t looks like a d
131e0 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c  atabase page hol
131f0 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69  ding.** no entri
13200 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
13210 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50  id zeroPage(MemP
13220 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
13230 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e  flags){.  unsign
13240 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
13250 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
13260 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13270 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
13280 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
13290 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66  rOffset;.  u16 f
132a0 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
132b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
132c0 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
132d0 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
132e0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
132f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
13300 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
13310 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
13320 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
13330 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
13340 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
13350 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
13360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13370 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
13380 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
13390 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
133a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
133b0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
133c0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62   );.  if( pBt->b
133d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41  tsFlags & BTS_FA
133e0 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20  ST_SECURE ){.   
133f0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
13400 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
13410 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
13420 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
13430 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
13440 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
13450 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
13460 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
13470 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
13480 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
13490 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
134a0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
134b0 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
134c0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
134d0 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
134e0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
134f0 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
13500 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
13510 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
13520 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
13530 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
13540 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
13550 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
13560 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
13570 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
13580 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
13590 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
135a0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
135b0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  e];.  pPage->nOv
135c0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
135d0 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
135e0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
135f0 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
13600 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
13610 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
13620 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
13630 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
13640 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
13650 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
13660 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
13670 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
13680 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
13690 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
136a0 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
136b0 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
136c0 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
136d0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
136e0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
136f0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
13700 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
13710 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
13720 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
13730 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
13740 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67  bPage);.  if( pg
13750 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  no!=pPage->pgno 
13760 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  ){.    pPage->aD
13770 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
13780 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
13790 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  e);.    pPage->p
137a0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
137b0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74  ;.    pPage->pBt
137c0 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67   = pBt;.    pPag
137d0 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
137e0 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66      pPage->hdrOf
137f0 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f  fset = pgno==1 ?
13800 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20   100 : 0;.  }.  
13810 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
13820 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
13830 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
13840 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e) );.  return p
13850 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
13860 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
13870 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
13880 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
13890 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
138a0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
138b0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20  ents if needed. 
138c0 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65   See also: btree
138d0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e  GetUnusedPage().
138e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41  .**.** If the PA
138f0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
13900 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  T flag is set, i
13910 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
13920 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61  do not care.** a
13930 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
13940 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
13950 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
13960 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
13970 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
13980 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
13990 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
139a0 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
139b0 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
139c0 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
139d0 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
139e0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
139f0 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
13a00 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
13a10 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
13a20 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
13a30 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
13a40 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
13a50 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
13a60 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
13a70 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
13a80 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
13a90 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
13aa0 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
13ab0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
13ac0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
13ad0 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
13ae0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
13af0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
13b00 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
13b10 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
13b20 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
13b30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
13b40 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
13b50 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
13b60 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
13b70 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
13b80 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
13b90 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
13ba0 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
13bb0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
13bc0 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
13bd0 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
13be0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13bf0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
13c00 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
13c10 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
13c20 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
13c30 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
13c40 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
13c50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13c60 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
13c70 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
13c80 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
13c90 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
13ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13cb0 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
13cc0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
13cd0 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
13ce0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
13cf0 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
13d00 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
13d10 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
13d20 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
13d30 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
13d40 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
13d50 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
13d60 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
13d70 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
13d80 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
13d90 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
13da0 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
13db0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
13dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13dd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13de0 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
13df0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
13e00 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
13e10 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
13e20 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
13e30 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
13e40 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
13e50 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
13e60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
13e70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13e80 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
13e90 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
13ea0 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
13eb0 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
13ec0 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
13ed0 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
13ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
13ef0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
13f00 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13f10 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
13f20 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
13f30 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
13f40 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
13f50 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
13f60 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
13f70 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
13f80 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
13f90 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
13fa0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
13fb0 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
13fc0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
13fd0 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
13fe0 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
13ff0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43   it..**.** If pC
14000 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ur!=0 then the p
14010 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74  age is being fet
14020 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ched as part of 
14030 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a  a moveToChild().
14040 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64  ** call.  Do add
14050 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63  itional sanity c
14060 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
14070 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
14080 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20  ..** And if the 
14090 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69  fetch fails, thi
140a0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64  s routine must d
140b0 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69  ecrement pCur->i
140c0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Page..**.** The 
140d0 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20  page is fetched 
140e0 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e  as read-write un
140f0 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74  less pCur is not
14100 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20   NULL and is.** 
14110 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
14120 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  or..**.** If an 
14130 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
14140 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e  en *ppPage is un
14150 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
14160 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
14170 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
14180 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
14190 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
141a0 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
141b0 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
141c0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
141d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
141e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
141f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14220 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
14230 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
14240 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
14250 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
14260 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
14270 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72   here */.  BtCur
14280 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
14290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
142a0 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20  rsor to receive 
142b0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c  the page, or NUL
142c0 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64  L */.  int bRead
142d0 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  Only            
142e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
142f0 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70  or a read-only p
14300 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
14310 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
14320 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
14330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14340 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
14350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
14360 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d  r==0 || ppPage==
14370 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a  &pCur->pPage );.
14380 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
14390 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
143a0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
143b0 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
143c0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
143d0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
143e0 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
143f0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
14400 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14410 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14420 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
14430 74 50 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20  tPage_error1;.  
14440 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
14450 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
14460 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
14470 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
14480 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
14490 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
144a0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
144b0 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 2a 70  error1;.  }.  *p
144c0 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
144d0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
144e0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
144f0 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
14500 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
14510 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d     btreePageFrom
14520 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
14530 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20  pgno, pBt);.    
14540 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
14550 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
14560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
14580 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
14590 65 72 72 6f 72 32 3b 0a 20 20 20 20 7d 0a 20 20  error2;.    }.  
145a0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
145b0 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
145c0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
145d0 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d  *ppPage)->aData=
145e0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
145f0 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
14600 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e  ..  /* If obtain
14610 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65  ing a child page
14620 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77   for a cursor, w
14630 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68  e must verify th
14640 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  at the page is. 
14650 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   ** compatible w
14660 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ith the root pag
14670 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  e. */.  if( pCur
14680 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
14690 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
146a0 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
146b0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29  ur->curIntKey) )
146c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
146d0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
146e0 67 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  gno);.    goto g
146f0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
14700 72 6f 72 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ror2;.  }.  retu
14710 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67  rn SQLITE_OK;..g
14720 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
14730 72 6f 72 32 3a 0a 20 20 72 65 6c 65 61 73 65 50  ror2:.  releaseP
14740 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 67 65  age(*ppPage);.ge
14750 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
14760 6f 72 31 3a 0a 20 20 69 66 28 20 70 43 75 72 20  or1:.  if( pCur 
14770 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  ){.    pCur->iPa
14780 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ge--;.    pCur->
14790 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
147a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
147b0 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  ];.  }.  testcas
147c0 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20  e( pgno==0 );.  
147d0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
147e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  || rc==SQLITE_CO
147f0 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72  RRUPT );.  retur
14800 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
14810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
14820 43 55 52 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20 53  CURRENT./* .** S
14830 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
14840 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 67 6e 6f  the MemPage.pgno
14850 52 6f 6f 74 20 76 61 72 69 61 62 6c 65 2c 20 69  Root variable, i
14860 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  f it exists..*/.
14870 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4d  static void setM
14880 65 6d 70 61 67 65 52 6f 6f 74 28 4d 65 6d 50 61  empageRoot(MemPa
14890 67 65 20 2a 70 50 67 2c 20 75 33 32 20 70 67 6e  ge *pPg, u32 pgn
148a0 6f 52 6f 6f 74 29 7b 0a 20 20 70 50 67 2d 3e 70  oRoot){.  pPg->p
148b0 67 6e 6f 52 6f 6f 74 20 3d 20 70 67 6e 6f 52 6f  gnoRoot = pgnoRo
148c0 6f 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  ot;.}.#else.# de
148d0 66 69 6e 65 20 73 65 74 4d 65 6d 70 61 67 65 52  fine setMempageR
148e0 6f 6f 74 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  oot(x,y).#endif.
148f0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
14900 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
14910 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
14920 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
14930 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
14940 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a  btreeGetPage..**
14950 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20 73  .** Page1 is a s
14960 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20  pecial case and 
14970 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64  must be released
14980 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61   using releasePa
14990 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  geOne()..*/.stat
149a0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
149b0 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
149c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
149d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
149e0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
149f0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
14a00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
14a10 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
14a20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
14a30 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
14a40 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
14a50 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
14a60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14a70 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
14a80 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
14a90 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
14aa0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14ab0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
14ac0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
14ad0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
14ae0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
14af0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
14b00 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
14b10 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
14b20 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
14b30 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
14b40 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
14b50 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
14b60 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65  eleasePageOne(Me
14b70 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
14b80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
14b90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14ba0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
14bb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
14bc0 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
14bd0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
14be0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14bf0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
14c00 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
14c10 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
14c20 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
14c30 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
14c40 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
14c50 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
14c60 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
14c70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14c80 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
14c90 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
14ca0 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67  te3PagerUnrefPag
14cb0 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50  eOne(pPage->pDbP
14cc0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
14cd0 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
14ce0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
14cf0 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
14d00 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
14d10 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
14d20 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
14d30 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
14d40 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
14d50 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
14d60 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
14d70 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
14d80 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
14d90 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
14da0 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
14db0 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
14dc0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
14dd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
14de0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
14df0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14e00 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
14e10 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
14e20 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
14e30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
14e40 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
14e50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
14e60 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
14e70 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
14e80 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
14e90 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
14ea0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
14eb0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
14ec0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
14ed0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
14ee0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
14ef0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
14f00 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
14f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14f20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
14f30 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
14f40 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
14f50 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
14f60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14f70 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
14f80 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
14f90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14fa0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14fb0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
14fc0 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
14fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
14fe0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
14ff0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
15000 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
15010 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
15020 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
15030 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
15040 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
15050 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
15060 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
15070 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
15080 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
15090 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
150a0 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
150b0 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
150c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
150d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
150e0 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
150f0 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
15100 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
15110 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
15120 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
15130 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
15140 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
15150 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
15160 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
15170 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
15180 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
15190 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
151a0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
151b0 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
151c0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
151d0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
151e0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
151f0 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
15200 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15210 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
15220 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
15230 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
15240 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
15250 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15260 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
15270 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
15280 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
15290 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
152a0 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
152b0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
152c0 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
152d0 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
152e0 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
152f0 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
15300 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
15310 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
15320 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
15330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
15340 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
15350 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
15360 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
15370 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
15380 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
15390 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
153a0 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
153b0 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
153c0 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
153d0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
153e0 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
153f0 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
15400 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
15410 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
15420 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
15430 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15440 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
15450 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
15460 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
15470 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
15480 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
15490 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
154a0 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
154b0 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
154c0 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
154d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
154e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
154f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15500 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
15510 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
15520 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
15530 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20 20  andler,.        
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15560 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
15570 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  pPager));.}../*.
15580 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
15590 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
155a0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
155b0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
155c0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
155d0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
155e0 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
155f0 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
15600 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
15610 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
15620 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
15630 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
15640 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
15650 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
15660 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
15670 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
15680 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
15690 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
156a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
156b0 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
156c0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
156d0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
156e0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
156f0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
15700 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
15710 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
15720 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
15730 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
15740 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
15750 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
15760 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
15770 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
15780 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
15790 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
157a0 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
157b0 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
157c0 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
157d0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
157e0 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
157f0 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
15800 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
15810 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
15820 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
15830 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
15840 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
15850 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
15860 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
15870 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
15880 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
15890 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
158a0 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
158b0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
158c0 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
158d0 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
158e0 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
158f0 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
15900 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
15910 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
15920 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
15930 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
15940 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
15950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
15960 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
15970 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
15980 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
15990 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
159a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
159b0 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
159c0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
159d0 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
159e0 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
159f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
15a00 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
15a10 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
15a20 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
15a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15a40 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
15a50 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
15a60 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
15a70 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
15a80 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
15a90 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
15aa0 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
15ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
15ac0 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
15ad0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
15ae0 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
15b10 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
15b20 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
15b30 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
15b40 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
15b50 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
15b60 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
15b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15b80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
15b90 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
15ba0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
15bb0 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15bd0 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
15be0 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
15bf0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
15c00 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
15c10 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
15c20 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
15c30 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
15c40 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
15c50 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
15c60 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
15c70 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
15c80 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
15c90 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
15ca0 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
15cb0 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
15cc0 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
15cd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
15ce0 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
15cf0 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
15d00 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
15d10 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
15d20 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
15d30 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
15d40 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
15d50 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
15d60 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
15d70 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
15d80 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
15d90 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
15db0 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
15dc0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
15dd0 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
15df0 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
15e00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
15e10 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
15e20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
15e30 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
15e40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15e50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15e60 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
15e70 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
15e80 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
15e90 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
15ea0 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
15eb0 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
15ec0 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
15ed0 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
15ee0 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
15ef0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
15f00 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
15f10 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
15f20 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
15f30 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
15f40 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
15f50 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
15f60 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
15f70 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
15f80 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
15f90 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
15fa0 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
15fb0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
15fc0 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
15fd0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
15fe0 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
15ff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
16000 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
16010 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
16020 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
16030 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
16040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
16050 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
16060 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
16070 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
16080 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
16090 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
160a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
160b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
160c0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
160d0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
160e0 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
160f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16100 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16110 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
16120 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
16130 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
16140 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
16150 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
16160 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
16170 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16180 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
16190 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
161a0 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
161b0 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
161c0 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
161d0 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
161e0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
161f0 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
16200 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
16210 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
16220 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
16230 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
16240 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
16250 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
16260 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16270 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
16280 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  .      int nFile
16290 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
162a0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
162b0 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  )+1;.      int n
162c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
162d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
162e0 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
162f0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
16300 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58  qlite3Malloc(MAX
16310 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e  (nFullPathname,n
16320 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
16330 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
16340 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
16350 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20  texShared; )..  
16360 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
16370 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
16380 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
16390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
163a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
163b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
163c0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
163d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
163e0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
163f0 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
16400 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
16410 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
16420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16440 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
16450 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
16490 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
164a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
164b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
164c0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
164d0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
164e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
164f0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
16500 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
16520 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
16530 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
16540 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
16550 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
16560 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
16570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
16580 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
16590 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
165a0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
165b0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
165c0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
165d0 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
165e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
165f0 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
16600 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
16610 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
16620 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16630 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
16640 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
16650 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
16660 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
16670 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
16680 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
16690 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
166a0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
166b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
166c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166d0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
166e0 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
166f0 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
16700 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
16710 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
16720 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
16730 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
16740 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
16750 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
16760 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
16770 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
16780 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
16790 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
167b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
167c0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
167e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
167f0 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
16800 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16810 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
16820 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
16830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16840 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
16850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16860 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
16870 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
16880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16890 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
168a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
168b0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
168c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
168d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
168e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
168f0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
16900 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
16910 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
16920 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
16930 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
16940 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
16950 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
16960 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
16970 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
16980 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
16990 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
169a0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
169b0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
169c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
169d0 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
169e0 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
169f0 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
16a00 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
16a10 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
16a20 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
16a30 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
16a40 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
16a50 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
16a60 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
16a70 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
16a80 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
16a90 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
16aa0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
16ab0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
16ac0 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
16ad0 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
16ae0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
16af0 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
16b00 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
16b10 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
16b20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
16b30 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
16b40 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
16b50 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
16b60 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16b70 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
16b80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16b90 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
16ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
16bb0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
16bc0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16bd0 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
16be0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16bf0 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
16c00 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
16c10 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
16c20 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
16c30 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
16c40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16c50 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
16c60 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
16c70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
16c80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16c90 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
16ca0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
16cb0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
16ce0 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
16cf0 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
16d00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
16d20 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
16d30 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
16d40 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
16d50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
16d60 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
16d70 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
16d80 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
16d90 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
16da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16db0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16dc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
16dd0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
16de0 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
16df0 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
16e00 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
16e10 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
16e20 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c  agerSetBusyHandl
16e30 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
16e40 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
16e50 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
16e60 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
16e70 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
16e80 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
16e90 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
16ea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
16eb0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
16ec0 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
16ed0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16ee0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20  _READ_ONLY;.#if 
16ef0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
16f00 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20  ECURE_DELETE).  
16f10 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
16f20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
16f30 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69  LETE;.#elif defi
16f40 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f  ned(SQLITE_FAST_
16f50 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
16f60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
16f70 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54   |= BTS_OVERWRIT
16f80 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  E;.#endif.    /*
16f90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
16fa0 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
16fb0 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
16fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
16fd0 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
16fe0 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
16ff0 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
17000 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
17010 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
17020 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
17030 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
17040 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
17050 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
17060 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c   (zDbHeader[16]<
17070 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72  <8) | (zDbHeader
17080 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
17090 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
170a0 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
170b0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
170c0 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
170d0 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
170e0 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
170f0 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
17100 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
17110 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
17120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17130 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
17140 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
17150 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
17160 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
17170 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
17180 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
17190 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
171a0 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
171b0 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
171c0 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
171d0 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
171e0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
171f0 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
17200 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
17210 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
17220 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
17230 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
17240 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
17250 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
17260 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
17270 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17280 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
17290 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
172a0 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
172b0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
172c0 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
172d0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
172e0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
172f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17300 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
17310 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
17320 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
17330 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
17340 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
17350 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
17360 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
17370 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
17380 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
17390 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d  NCE-OF: R-37497-
173a0 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f  42412 The size o
173b0 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72  f the reserved r
173c0 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a  egion is.      *
173d0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
173e0 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
173f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
17400 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
17410 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20   of 20.      ** 
17420 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17430 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
17440 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  /.      nReserve
17450 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
17460 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
17470 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17480 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
17490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
174a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
174b0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
174c0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
174d0 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
174e0 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
174f0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
17500 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
17510 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
17520 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
17530 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
17540 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
17550 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
17560 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
17570 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
17580 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
17590 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
175a0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
175b0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
175c0 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
175d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
175e0 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
175f0 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
17600 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
17610 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
17620 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
17630 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
17640 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
17650 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
17660 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
17670 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
17680 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
17690 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
176a0 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
176b0 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e     */.    pBt->n
176c0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Ref = 1;.    if(
176d0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
176e0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
176f0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
17700 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
17710 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
17720 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
17730 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
17740 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
17750 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
17760 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
17770 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
17780 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
17790 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
177a0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
177b0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
177c0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
177d0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
177e0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
177f0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
17800 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17810 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
17820 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
17830 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
17840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17850 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
17860 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
17870 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
17880 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
17890 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
178a0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
178b0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
178c0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
178d0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
178e0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
178f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17900 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
17910 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
17920 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
17930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
17940 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
17950 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17960 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
17970 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
17980 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
17990 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
179a0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
179b0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
179c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
179d0 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
179e0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
179f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
17a00 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
17a10 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
17a20 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
17a30 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
17a40 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
17a50 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
17a60 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
17a70 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
17a80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
17a90 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
17aa0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
17ab0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
17ac0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
17ad0 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
17ae0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
17af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70  .        if( (up
17b00 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29  tr)p->pBt<(uptr)
17b10 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
17b20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
17b30 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
17b40 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
17b50 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
17b60 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
17b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b80 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
17b90 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29  >pNext && (uptr)
17ba0 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
17bb0 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b  <(uptr)p->pBt ){
17bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
17bd0 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
17be0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17bf0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
17c00 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
17c10 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
17c20 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
17c30 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
17c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17c50 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
17c60 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
17c70 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
17c80 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
17c90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
17ca0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
17cb0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
17cc0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
17cd0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
17ce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17cf0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
17d00 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
17d10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17d20 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
17d30 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  >pPager, 0);.   
17d40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
17d50 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
17d60 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
17d70 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
17d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
17d90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
17da0 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e;..    /* If th
17db0 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63  e B-Tree was suc
17dc0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
17dd0 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d  , set the pager-
17de0 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68  cache size to th
17df0 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
17e00 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
17e10 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20  when opening on 
17e20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72  an existing shar
17e30 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a  ed pager-cache,.
17e40 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68      ** do not ch
17e50 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63  ange the pager-c
17e60 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  ache size..    *
17e70 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
17e80 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20  3BtreeSchema(p, 
17e90 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0, 0)==0 ){.    
17ea0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
17eb0 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42  tCachesize(p->pB
17ec0 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54  t->pPager, SQLIT
17ed0 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
17ee0 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  SIZE);.    }..  
17ef0 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    pFile = sqlite
17f00 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
17f10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
17f20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
17f30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17f40 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
17f50 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
17f60 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69  _FCNTL_PDB, (voi
17f70 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20  d*)&pBt->db);.  
17f80 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
17f90 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
17fa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17fb0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
17fc0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
17fd0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
17fe0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
17ff0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
18000 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
18010 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f  e3BtreeConnectio
18020 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29  nCount(*ppBtree)
18030 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >0 );.  return r
18040 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
18050 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
18060 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
18070 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
18080 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
18090 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
180a0 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
180b0 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
180c0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
180d0 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
180e0 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
180f0 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
18100 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
18110 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
18120 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
18130 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
18140 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
18150 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
18160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
18170 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55  HARED_CACHE.  MU
18180 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
18190 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
181a0 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20  r; ).  BtShared 
181b0 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
181c0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
181d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
181e0 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
181f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54  >mutex) );.  MUT
18200 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
18210 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
18220 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
18230 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
18240 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
18250 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
18260 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
18270 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
18280 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
18290 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
182a0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
182b0 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
182c0 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
182d0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
182e0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
182f0 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
18300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18310 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
18320 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
18330 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
18340 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
18350 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
18360 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
18370 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
18380 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
18390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
183a0 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
183b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
183c0 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
183d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
183e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
183f0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
18400 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18410 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
18420 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
18430 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
18440 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
18450 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
18460 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
18470 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
18480 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
18490 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
184a0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
184b0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
184c0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
184d0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
184e0 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34  ) bytes with a 4
184f0 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72  -byte prefix for
18500 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a   a left-child.**
18510 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
18520 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
18530 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
18540 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
18550 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
18560 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
18570 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
18580 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
18590 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20  >pageSize );..  
185a0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
185b0 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d  uses of pBt->pTm
185c0 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72  pSpace is to for
185d0 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  mat cells before
185e0 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e  .    ** insertin
185f0 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65  g them into a le
18600 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f  af page (functio
18610 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e  n fillInCell()).
18620 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c   If.    ** a cel
18630 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34  l is less than 4
18640 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
18650 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70  it is rounded up
18660 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20   to 4 bytes.    
18670 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ** by the variou
18680 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  s routines that 
18690 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72  manipulate binar
186a0 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20  y cells. Which. 
186b0 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74     ** can mean t
186c0 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  hat fillInCell()
186d0 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65   only initialize
186e0 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72  s the first 2 or
186f0 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20   3.    ** bytes 
18700 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75  of pTmpSpace, bu
18710 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  t that the first
18720 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70   4 bytes are cop
18730 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ied from.    ** 
18740 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61  it into a databa
18750 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73  se page. This is
18760 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20   not actually a 
18770 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a  problem, but it.
18780 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73      ** does caus
18790 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72  e a valgrind err
187a0 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72  or when the 1 or
187b0 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74   2 bytes of unit
187c0 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20  ialized .    ** 
187d0 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74  data is passed t
187e0 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72  o system call wr
187f0 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f  ite(). So to avo
18800 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20  id this error,. 
18810 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66     ** zero the f
18820 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
18830 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e  temp space here.
18840 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
18850 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f  lso:  Provide fo
18860 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74  ur bytes of init
18870 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65  ialized space be
18880 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
18890 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d  beginning of pTm
188a0 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65  pSpace as an are
188b0 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70  a available to p
188c0 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a  repend the.    *
188d0 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69  * left-child poi
188e0 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69  nter to the begi
188f0 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e  nning of a cell.
18900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18910 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
18920 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
18930 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30  Bt->pTmpSpace, 0
18940 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  , 8);.      pBt-
18950 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b  >pTmpSpace += 4;
18960 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
18970 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
18980 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
18990 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
189a0 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
189b0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
189c0 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  t){.  if( pBt->p
189d0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
189e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d  pBt->pTmpSpace -
189f0 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 4;.    sqlite3
18a00 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54  PageFree(pBt->pT
18a10 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42  mpSpace);.    pB
18a20 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
18a30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
18a40 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
18a50 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
18a60 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
18a70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18a80 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
18a90 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
18aa0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18ab0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
18ac0 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
18ad0 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
18ae0 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
18af0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18b10 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
18b20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
18b30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
18b40 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
18b50 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
18b60 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
18b70 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
18b80 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
18b90 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
18ba0 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
18bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
18bc0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
18bd0 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
18be0 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
18bf0 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
18c00 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
18c10 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
18c20 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
18c30 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
18c40 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
18c50 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
18c60 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
18c70 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
18c80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
18c90 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c  eRollback(p, SQL
18ca0 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71  ITE_OK, 0);.  sq
18cb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18cc0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
18cd0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
18ce0 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
18cf0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
18d00 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
18d10 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
18d20 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
18d30 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
18d40 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
18d50 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
18d60 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
18d70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
18d80 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
18d90 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
18da0 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
18db0 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
18dc0 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
18dd0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
18de0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
18df0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
18e00 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
18e10 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
18e20 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
18e30 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
18e40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
18e50 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
18e60 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
18e70 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
18e80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
18e90 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
18ea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
18eb0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
18ec0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
18ed0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
18ee0 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
18ef0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
18f00 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
18f10 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
18f20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
18f30 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
18f40 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
18f50 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
18f60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
18f70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
18f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
18f90 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
18fa0 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
18fb0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
18fc0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
18fd0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
18fe0 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
18ff0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
19000 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
19010 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
19020 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
19030 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
19040 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
19050 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19060 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
19070 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  oft" limit on th
19080 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
19090 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
190a0 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e  ** Unused and un
190b0 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77  modified pages w
190c0 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20  ill be recycled 
190d0 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
190e0 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  of.** pages in t
190f0 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73  he cache exceeds
19100 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74   this soft limit
19110 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20  .  But the size 
19120 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  of the.** cache 
19130 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72  is allowed to gr
19140 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ow larger than t
19150 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20  his limit if it 
19160 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74  contains.** dirt
19170 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73  y pages or pages
19180 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65   still in active
19190 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
191a0 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
191b0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
191c0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
191d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
191e0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
191f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19200 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
19210 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
19220 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
19230 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
19240 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
19250 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
19260 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19270 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
19280 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19290 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
192a0 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74  pill" limit on t
192b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
192c0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
192d0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
192e0 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65  r of pages excee
192f0 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75  ds this limit du
19300 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61  ring a write tra
19310 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  nsaction,.** the
19320 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74   pager might att
19330 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20  empt to "spill" 
19340 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  pages to the jou
19350 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a  rnal early in.**
19360 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
19370 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  p memory..**.** 
19380 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
19390 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  ed is the curren
193a0 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49  t spill size.  I
193b0 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64  f zero is passed
193c0 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  .** as an argume
193d0 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  nt, no changes a
193e0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73  re made to the s
193f0 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e  pill size settin
19400 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d  g, so.** using m
19410 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20  xPage of 0 is a 
19420 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65  way to query the
19430 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
19440 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ize..*/.int sqli
19450 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
19460 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
19470 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
19480 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19490 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b  >pBt;.  int res;
194a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
194b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
194c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
194d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
194e0 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73  er(p);.  res = s
194f0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70  qlite3PagerSetSp
19500 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  illsize(pBt->pPa
19510 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
19520 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19530 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19540 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  es;.}..#if SQLIT
19550 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
19560 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  0./*.** Change t
19570 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
19580 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61  amount of the da
19590 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
195a0 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72   may be.** memor
195b0 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74  y mapped..*/.int
195c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
195d0 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20  MmapLimit(Btree 
195e0 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
195f0 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53  4 szMmap){.  BtS
19600 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19610 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
19620 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19630 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
19640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19650 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
19660 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
19670 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
19680 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71  r, szMmap);.  sq
19690 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
196a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
196b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
196c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
196d0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
196e0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
196f0 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
19700 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
19710 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
19720 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
19730 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
19740 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
19750 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
19760 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
19770 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
19780 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
19790 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
197a0 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
197b0 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
197c0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
197d0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
197e0 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
197f0 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
19800 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
19810 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
19820 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
19830 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
19840 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
19850 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
19860 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
19870 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
19880 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
19890 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
198a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
198b0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
198c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
198d0 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20  etPagerFlags(.  
198e0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
198f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
19900 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
19910 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
19920 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
19930 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61  lags       /* Va
19940 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c  rious PAGER_* fl
19950 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ags */.){.  BtSh
19960 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19970 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
19980 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19990 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
199a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
199b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
199c0 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
199d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
199e0 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
199f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19a10 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
19a20 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
19a30 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
19a40 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
19a50 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
19a60 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
19a70 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
19a80 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
19a90 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
19aa0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
19ab0 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
19ac0 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
19ad0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
19ae0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
19af0 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
19b00 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
19b10 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
19b20 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
19b30 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
19b40 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
19b50 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
19b60 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
19b70 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
19b80 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
19b90 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
19ba0 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
19bb0 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
19bc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19bd0 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
19be0 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
19bf0 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
19c00 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
19c10 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
19c20 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
19c30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
19c40 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
19c50 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
19c60 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
19c70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
19c80 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
19c90 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
19ca0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
19cb0 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
19cc0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
19cd0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
19ce0 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
19cf0 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
19d00 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
19d10 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
19d20 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
19d30 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
19d40 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
19d50 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
19d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
19d70 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
19d80 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
19d90 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
19da0 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
19db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19dc0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19dd0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
19de0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
19df0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
19e00 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
19e10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
19e20 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
19e30 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  C.  if( nReserve
19e40 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
19e50 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69  erve ) pBt->opti
19e60 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38  malReserve = (u8
19e70 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  )nReserve;.#endi
19e80 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  f.  if( pBt->bts
19e90 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
19ea0 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20  SIZE_FIXED ){.  
19eb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19ec0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
19ed0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
19ee0 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
19ef0 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
19f00 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
19f10 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
19f20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
19f30 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
19f40 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
19f50 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
19f60 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
19f70 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
19f80 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
19f90 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
19fa0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
19fb0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
19fc0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
19fd0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
19fe0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
19ff0 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
1a000 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29  pageSize = (u32)
1a010 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
1a020 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1a030 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1a040 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1a050 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1a060 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1a070 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70  , nReserve);.  p
1a080 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
1a090 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
1a0a0 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
1a0b0 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74    if( iFix ) pBt
1a0c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a0d0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
1a0e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a0f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a110 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1a120 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
1a130 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
1a140 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1a150 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
1a160 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
1a170 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
1a180 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a190 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
1a1a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a1b0 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70  Reserve(), excep
1a1c0 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79  t that it.** may
1a1d0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
1a1e0 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
1a1f0 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74  eed that the b-t
1a200 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72  ree mutex is alr
1a210 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a  eady.** held..**
1a220 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66  .** This is usef
1a230 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61  ul in one specia
1a240 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61  l case in the ba
1a250 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68  ckup API code wh
1a260 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f  ere it is.** kno
1a270 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72  wn that the shar
1a280 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
1a290 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65  is held, but the
1a2a0 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a   mutex on the .*
1a2b0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1a2c0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69  e that owns *p i
1a2d0 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63  s not. In this c
1a2e0 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74  ase if sqlite3Bt
1a2f0 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65  reeEnter().** we
1a300 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c  re to be called,
1a310 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64   it might collid
1a320 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65  e with some othe
1a330 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  r operation on t
1a340 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
1a350 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
1a360 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65  *p, causing unde
1a370 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a  fined behavior..
1a380 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a390 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
1a3a0 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a  utex(Btree *p){.
1a3b0 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
1a3c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a3d0 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
1a3e0 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d  tex) );.  n = p-
1a3f0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
1a400 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
1a410 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ize;.  return n;
1a420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a430 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1a440 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
1a450 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1a460 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
1a470 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
1a480 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
1a490 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
1a4a0 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
1a4b0 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
1a4c0 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
1a4d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  s..**.** If SQLI
1a4e0 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20  TE_HAS_MUTEX is 
1a4f0 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65  defined then the
1a500 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
1a510 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74   is the.** great
1a520 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  er of the curren
1a530 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  t reserved space
1a540 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
1a550 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65   requested.** re
1a560 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a  serve space..*/.
1a570 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a580 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76  GetOptimalReserv
1a590 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
1a5a0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
1a5b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a5c0 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
1a5d0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
1a5e0 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  x(p);.#ifdef SQL
1a5f0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
1a600 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70  if( n<p->pBt->op
1a610 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e  timalReserve ) n
1a620 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   = p->pBt->optim
1a630 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  alReserve;.#endi
1a640 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  f.  sqlite3Btree
1a650 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a660 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
1a670 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
1a680 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
1a690 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
1a6a0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
1a6b0 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
1a6c0 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
1a6d0 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
1a6e0 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
1a6f0 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
1a700 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
1a710 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
1a720 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
1a730 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
1a740 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
1a750 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
1a760 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
1a770 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a780 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
1a790 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
1a7a0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
1a7b0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
1a7c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a7d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
1a7e0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1a7f0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
1a800 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
1a810 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
1a820 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a  ITE flags:.**.**
1a830 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20      newFlag==0  
1a840 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45       Both BTS_SE
1a850 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20  CURE_DELETE and 
1a860 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72  BTS_OVERWRITE ar
1a870 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  e cleared.**    
1a880 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20  newFlag==1      
1a890 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
1a8a0 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f  TE set and BTS_O
1a8b0 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65 61  VERWRITE is clea
1a8c0 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  red.**    newFla
1a8d0 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53  g==2       BTS_S
1a8e0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65  ECURE_DELETE cle
1a8f0 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45  ared and BTS_OVE
1a900 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a  RWRITE is set.**
1a910 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31      newFlag==(-1
1a920 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a  )    No changes.
1a930 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a940 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75 65  ne acts as a que
1a950 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ry if newFlag is
1a960 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a   less than zero.
1a970 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f  **.** With BTS_O
1a980 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64 65  VERWRITE set, de
1a990 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73  leted content is
1a9a0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
1a9b0 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72  zeros, but.** fr
1a9c0 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  eelist leaf page
1a9d0 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65  s are not writte
1a9e0 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  n back to the da
1a9f0 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e  tabase.  Thus in
1aa00 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64  -page.** deleted
1aa10 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61   content is clea
1aa20 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73  red, but freelis
1aa30 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  t deleted conten
1aa40 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  t is not..**.** 
1aa50 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f  With BTS_SECURE_
1aa60 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f  DELETE, operatio
1aa70 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56  n is like BTS_OV
1aa80 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68 65  ERWRITE with the
1aa90 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61   addition.** tha
1aaa0 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20  t freelist leaf 
1aab0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
1aac0 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
1aad0 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61  database, increa
1aae0 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75  sing.** the amou
1aaf0 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a  nt of disk I/O..
1ab00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ab10 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
1ab20 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
1ab30 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
1ab40 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1ab50 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
1ab60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1ab70 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56    assert( BTS_OV
1ab80 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43  ERWRITE==BTS_SEC
1ab90 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a  URE_DELETE*2 );.
1aba0 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46 41    assert( BTS_FA
1abb0 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f  ST_SECURE==(BTS_
1abc0 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45  OVERWRITE|BTS_SE
1abd0 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a  CURE_DELETE) );.
1abe0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
1abf0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
1ac00 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1ac10 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20  _FAST_SECURE;.  
1ac20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
1ac30 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
1ac40 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b  _DELETE*newFlag;
1ac50 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70  .  }.  b = (p->p
1ac60 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1ac70 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f  TS_FAST_SECURE)/
1ac80 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
1ac90 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  E;.  sqlite3Btre
1aca0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1acb0 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn b;.}../*.** 
1acc0 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
1acd0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
1ace0 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
1acf0 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
1ad00 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
1ad10 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
1ad20 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
1ad30 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
1ad40 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
1ad50 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
1ad60 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
1ad70 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
1ad80 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
1ad90 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
1ada0 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
1adb0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
1adc0 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
1add0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
1ade0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
1adf0 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
1ae00 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
1ae10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ae20 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
1ae30 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
1ae40 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
1ae50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1ae60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ae70 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
1ae80 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
1ae90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1aea0 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
1aeb0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1aec0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
1aed0 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
1aee0 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
1aef0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1af00 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1af10 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
1af20 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
1af30 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
1af40 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
1af50 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
1af60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1af70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1af80 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
1af90 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
1afa0 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
1afb0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
1afc0 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
1afd0 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
1afe0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1aff0 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
1b000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
1b010 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
1b020 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
1b030 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b040 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
1b050 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
1b060 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
1b070 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1b080 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1b090 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
1b0a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
1b0b0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
1b0c0 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
1b0d0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
1b0e0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
1b0f0 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
1b100 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
1b110 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
1b120 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b130 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
1b140 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  if.}../*.** If t
1b150 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20  he user has not 
1b160 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c  set the safety-l
1b170 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61  evel for this da
1b180 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1b190 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47  n.** using "PRAG
1b1a0 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c  MA synchronous",
1b1b0 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66 65   and if the safe
1b1c0 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20  ty-level is not 
1b1d0 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74  already.** set t
1b1e0 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
1b1f0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1b200 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ion as the secon
1b210 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20  d parameter,.** 
1b220 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69  set it so..*/.#i
1b230 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1b240 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51  _SYNCHRONOUS!=SQ
1b250 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
1b260 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20  _SYNCHRONOUS \. 
1b270 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53     && !defined(S
1b280 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
1b290 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44  static void setD
1b2a0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42  efaultSyncFlag(B
1b2b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38  tShared *pBt, u8
1b2c0 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a   safety_level){.
1b2d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1b2e0 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20   Db *pDb;.  if( 
1b2f0 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20  (db=pBt->db)!=0 
1b300 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29  && (pDb=db->aDb)
1b310 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  !=0 ){.    while
1b320 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c  ( pDb->pBt==0 ||
1b330 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d   pDb->pBt->pBt!=
1b340 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a  pBt ){ pDb++; }.
1b350 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79      if( pDb->bSy
1b360 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26  ncSet==0 .     &
1b370 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65  & pDb->safety_le
1b380 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65  vel!=safety_leve
1b390 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d  l .     && pDb!=
1b3a0 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20  &db->aDb[1] .   
1b3b0 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73   ){.      pDb->s
1b3c0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61  afety_level = sa
1b3d0 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20  fety_level;.    
1b3e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
1b3f0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
1b400 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  er,.          pD
1b410 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
1b420 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
1b430 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
1b440 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
1b450 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
1b460 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
1b470 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65  (pBt,safety_leve
1b480 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  l).#endif../* Fo
1b490 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1b4a0 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1b4b0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
1b4c0 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  ared*);.../*.** 
1b4d0 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
1b4e0 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
1b4f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b500 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
1b510 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
1b520 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
1b530 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
1b540 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1b550 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
1b560 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
1b570 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
1b580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1b590 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
1b5a0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
1b5b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1b5c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
1b5d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
1b5e0 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
1b5f0 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
1b600 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
1b610 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
1b620 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
1b630 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
1b640 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b660 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
1b670 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
1b680 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1b690 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
1b6a0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
1b6b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20  e file */.  u32 
1b6c0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1b6d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1b6e0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1b6f0 61 73 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ase */.  u32 nPa
1b700 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
1b710 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1b720 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b730 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e   file */.  u32 n
1b740 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
1b750 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1b760 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1b770 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
1b780 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
1b790 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b7a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1b7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1b7c0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
1b7d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b7e0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
1b7f0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
1b800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b810 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
1b820 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1b830 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
1b840 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
1b850 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b860 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
1b870 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
1b880 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
1b890 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
1b8a0 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
1b8b0 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
1b8c0 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
1b8d0 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
1b8e0 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
1b8f0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1b900 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
1b910 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1b920 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29  ->pPager, (int*)
1b930 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
1b940 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
1b950 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
1b960 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
1b970 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1b980 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
1b990 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
1b9a0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42  e;.  }.  if( (pB
1b9b0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
1b9c0 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62  QLITE_ResetDatab
1b9d0 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  ase)!=0 ){.    n
1b9e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
1b9f0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
1ba00 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
1ba10 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
1ba20 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
1ba30 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
1ba40 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
1ba50 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
1ba60 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1ba70 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
1ba80 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
1ba90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1baa0 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
1bab0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
1bac0 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
1bad0 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
1bae0 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
1baf0 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
1bb00 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
1bb10 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
1bb20 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
1bb30 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
1bb40 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1bb50 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1bb60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1bb70 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
1bb80 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
1bb90 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1bba0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
1bbb0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
1bbc0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
1bbd0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1bbe0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1bbf0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1bc00 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
1bc10 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
1bc20 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
1bc30 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
1bc40 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1bc50 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
1bc60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1bc70 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
1bc80 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
1bc90 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
1bca0 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
1bcb0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
1bcc0 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
1bcd0 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
1bce0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
1bcf0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
1bd00 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
1bd10 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
1bd20 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
1bd30 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
1bd40 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
1bd50 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
1bd60 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
1bd70 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
1bd80 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
1bd90 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
1bda0 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
1bdb0 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
1bdc0 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
1bdd0 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
1bde0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
1bdf0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
1be00 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
1be10 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
1be20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
1be30 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
1be40 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1be50 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
1be60 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
1be70 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
1be80 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
1be90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1bea0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
1beb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
1bec0 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
1bed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bee0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1bef0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1bf00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bf10 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
1bf20 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
1bf30 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
1bf40 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
1bf50 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
1bf60 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
1bf70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1bf80 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
1bf90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bfa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1bfb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1bfc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
1bfd0 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  DB;.    }else{. 
1bfe0 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
1bff0 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
1c000 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
1c010 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
1c020 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1c030 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1c040 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
1c050 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
1c060 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
1c070 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
1c080 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
1c090 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
1c0a0 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
1c0b0 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
1c0c0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
1c0d0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
1c0e0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
1c0f0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
1c100 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
1c110 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
1c120 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
1c130 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
1c140 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c150 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
1c160 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
1c170 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
1c180 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1c190 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1c1a0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1c1b0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
1c1c0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
1c1d0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
1c1e0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
1c1f0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
1c200 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
1c210 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
1c220 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
1c230 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
1c240 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1c250 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1c260 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
1c270 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
1c280 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
1c290 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
1c2a0 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
1c2b0 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
1c2c0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
1c2d0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
1c2e0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
1c2f0 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
1c300 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
1c310 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
1c320 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
1c330 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
1c340 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
1c350 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
1c360 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
1c370 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1c380 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1c390 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
1c3a0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1c3b0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 20 20 61 73  ZE_FIXED;.    as
1c3c0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
1c3d0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
1c3e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1c3f0 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
1c400 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
1c410 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
1c420 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
1c430 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
1c440 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1c450 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1c460 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
1c470 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
1c480 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
1c490 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
1c4a0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
1c4b0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
1c4c0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
1c4d0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
1c4e0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
1c4f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1c500 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
1c510 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
1c520 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1c530 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
1c540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c550 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
1c560 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
1c570 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
1c580 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
1c590 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
1c5a0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c5b0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
1c5c0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
1c5d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c5e0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
1c5f0 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
1c600 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
1c610 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
1c620 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
1c630 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
1c640 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
1c650 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
1c660 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
1c670 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1c680 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
1c690 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
1c6a0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
1c6b0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
1c6c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
1c6d0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
1c6e0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
1c6f0 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
1c700 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1c710 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1c720 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1c730 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1c740 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1c750 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1c760 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1c770 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1c780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c790 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1c7a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1c7b0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c7e0 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1c7f0 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1c800 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c810 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74 61  if( sqlite3Writa
1c820 62 6c 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 64  bleSchema(pBt->d
1c830 62 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  b)==0 && nPage>n
1c840 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
1c850 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1c860 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1c870 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1c880 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1c890 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c8a0 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
1c8b0 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
1c8c0 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
1c8d0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
1c8e0 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
1c8f0 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
1c900 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
1c910 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
1c920 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1c930 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
1c940 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
1c950 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
1c960 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
1c970 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1c980 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1c990 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
1c9a0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1c9b0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
1c9c0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
1c9d0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
1c9e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1c9f0 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
1ca00 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
1ca10 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1ca20 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
1ca30 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1ca40 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1ca50 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
1ca60 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
1ca70 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
1ca80 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
1ca90 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
1caa0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
1cab0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
1cac0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
1cad0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
1cae0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
1caf0 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
1cb00 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
1cb10 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
1cb20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
1cb30 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
1cb40 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
1cb50 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
1cb60 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
1cb70 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
1cb80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1cb90 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
1cba0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
1cbb0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
1cbc0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
1cbd0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
1cbe0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
1cbf0 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
1cc00 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
1cc10 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
1cc20 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
1cc30 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
1cc40 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
1cc50 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
1cc60 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
1cc70 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
1cc80 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
1cc90 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
1cca0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
1ccb0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
1ccc0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
1ccd0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1cce0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
1ccf0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
1cd00 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
1cd10 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1cd20 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1cd30 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
1cd40 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
1cd50 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
1cd60 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
1cd70 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
1cd80 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1cd90 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
1cda0 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
1cdb0 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
1cdc0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1cdd0 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
1cde0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1cdf0 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
1ce00 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
1ce10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1ce20 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
1ce30 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
1ce40 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
1ce50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
1ce60 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1ce70 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1ce80 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
1ce90 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
1cea0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1ceb0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
1cec0 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
1ced0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1cee0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1cef0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1cf00 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
1cf10 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
1cf20 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
1cf30 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
1cf40 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
1cf50 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
1cf60 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
1cf70 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
1cf80 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
1cf90 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
1cfa0 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
1cfb0 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
1cfc0 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
1cfd0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1cfe0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
1cff0 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
1d000 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
1d010 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
1d020 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
1d030 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
1d040 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
1d050 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1d060 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
1d070 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
1d080 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
1d090 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
1d0a0 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
1d0b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
1d0c0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
1d0d0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
1d0e0 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
1d0f0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1d100 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
1d110 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
1d120 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
1d130 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
1d140 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
1d150 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
1d160 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1d170 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
1d180 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1d190 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
1d1a0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
1d1b0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
1d1c0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1d1d0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
1d1e0 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
1d1f0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
1d200 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
1d210 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
1d220 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
1d230 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d240 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1d250 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
1d260 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1d270 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d280 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
1d290 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
1d2a0 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
1d2b0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1d2c0 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
1d2d0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1d2e0 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
1d2f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1d300 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1d310 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1d320 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1d330 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d340 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1d350 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1d360 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1d370 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
1d380 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
1d390 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
1d3a0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
1d3b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1d3c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
1d3d0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
1d3e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1d3f0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1d400 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1d410 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1d420 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1d430 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1d440 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
1d450 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
1d460 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
1d470 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1d480 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
1d490 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
1d4a0 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
1d4b0 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
1d4c0 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
1d4d0 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
1d4e0 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
1d4f0 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
1d500 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
1d510 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1d520 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
1d530 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
1d540 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
1d550 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
1d560 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
1d570 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1d580 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d590 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d5a0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
1d5b0 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
1d5c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d5d0 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
1d5e0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
1d5f0 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
1d600 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
1d610 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
1d620 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
1d630 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1d640 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1d650 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
1d660 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
1d670 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
1d680 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
1d690 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1d6a0 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
1d6b0 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
1d6c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
1d6d0 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1d6e0 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
1d6f0 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
1d700 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
1d710 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
1d720 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
1d730 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
1d740 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
1d750 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1d760 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
1d770 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
1d780 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
1d790 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
1d7a0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
1d7b0 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
1d7c0 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
1d7d0 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
1d7e0 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
1d7f0 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
1d800 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
1d810 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
1d820 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
1d830 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1d840 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1d850 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
1d860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d870 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
1d880 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1d890 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
1d8a0 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
1d8b0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
1d8c0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1d8d0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
1d8e0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1d8f0 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
1d900 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1d910 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1d920 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
1d930 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
1d940 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
1d950 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
1d960 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
1d970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d980 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1d990 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1d9a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1d9b0 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
1d9c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
1d9d0 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
1d9e0 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
1d9f0 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
1da00 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1da10 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
1da20 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1da30 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1da40 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1da50 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
1da60 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1da70 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1da80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
1da90 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
1daa0 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
1dab0 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
1dac0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1dad0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1dae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
1daf0 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
1db00 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
1db10 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1db20 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
1db30 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1db40 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
1db50 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
1db60 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
1db70 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1db80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1db90 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
1dba0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
1dbb0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1dbc0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
1dbd0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
1dbe0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
1dbf0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1dc00 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
1dc10 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
1dc20 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
1dc30 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
1dc40 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
1dc50 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
1dc60 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
1dc70 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
1dc80 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
1dc90 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
1dca0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1dcb0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1dcc0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1dcd0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1dce0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
1dcf0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1dd00 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
1dd10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1dd20 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
1dd30 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
1dd40 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1dd50 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
1dd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1dd70 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
1dd80 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1dd90 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
1dda0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ddb0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1ddc0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1ddd0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
1dde0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1ddf0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
1de00 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1de10 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
1de20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1de30 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
1de40 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
1de50 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
1de60 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
1de70 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
1de80 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
1de90 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
1dea0 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
1deb0 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
1dec0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1ded0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
1dee0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
1def0 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
1df00 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
1df10 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
1df20 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1df30 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
1df40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1df50 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
1df60 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1df70 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
1df80 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1df90 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
1dfa0 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
1dfb0 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
1dfc0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
1dfd0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
1dfe0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
1dff0 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
1e000 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1e010 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
1e020 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
1e030 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
1e040 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
1e050 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
1e060 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1e070 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
1e080 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
1e090 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
1e0a0 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
1e0b0 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
1e0c0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
1e0d0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
1e0e0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
1e0f0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
1e100 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
1e110 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
1e120 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
1e130 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1e140 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
1e150 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
1e160 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
1e170 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
1e180 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1e190 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
1e1a0 2c 20 69 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e  , int wrflag, in
1e1b0 74 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f  t *pSchemaVersio
1e1c0 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  n){.  BtShared *
1e1d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e1e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e1f0 4f 4b 3b 0a 20 20 69 6e 74 20 62 43 6f 6e 63 75  OK;.  int bConcu
1e200 72 72 65 6e 74 20 3d 20 28 70 2d 3e 64 62 2d 3e  rrent = (p->db->
1e210 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 21  bConcurrent && !
1e220 49 53 41 55 54 4f 56 41 43 55 55 4d 29 3b 0a 0a  ISAUTOVACUUM);..
1e230 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1e240 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1e250 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1e260 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
1e270 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1e280 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1e290 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
1e2a0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
1e2b0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
1e2c0 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
1e2d0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
1e2e0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
1e2f0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1e300 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1e310 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1e320 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
1e330 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
1e340 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
1e350 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1e360 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1e370 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1e380 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
1e390 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
1e3a0 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
1e3b0 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e 64 62 2d  ;..  if( (p->db-
1e3c0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1e3d0 52 65 73 65 74 44 61 74 61 62 61 73 65 29 20 0a  ResetDatabase) .
1e3e0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
1e3f0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
1e400 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 0a 20 20  ->pPager)==0 .  
1e410 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  ){.    pBt->btsF
1e420 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 52 45 41  lags &= ~BTS_REA
1e430 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  D_ONLY;.  }..  /
1e440 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
1e450 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
1e460 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
1e470 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1e480 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
1e490 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1e4a0 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
1e4b0 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
1e4c0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1e4d0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1e4e0 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
1e4f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e500 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b  SHARED_CACHE.  {
1e510 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42  .    sqlite3 *pB
1e520 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  lock = 0;.    /*
1e530 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1e540 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1e550 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1e560 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1e570 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  on .    ** on th
1e580 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
1e590 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
1e5a0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
1e5b0 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  nsaction is.    
1e5c0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
1e5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1e5e0 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ED..    */.    i
1e5f0 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
1e600 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1e610 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
1e620 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73      || (pBt->bts
1e630 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
1e640 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ING)!=0.    ){. 
1e650 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42       pBlock = pB
1e660 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
1e670 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
1e680 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  flag>1 ){.      
1e690 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
1e6a0 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70       for(pIter=p
1e6b0 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1e6c0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1e6d0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
1e6e0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
1e6f0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=p ){.         
1e700 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
1e710 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
1e720 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e740 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1e750 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  lock ){.      sq
1e760 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
1e770 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
1e780 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  lock);.      rc 
1e790 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
1e7a0 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
1e7b0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1e7c0 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  gun;.    }.  }.#
1e7d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
1e7e0 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
1e7f0 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
1e800 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
1e810 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
1e820 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
1e830 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
1e840 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
1e850 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
1e860 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
1e870 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
1e880 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
1e890 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
1e8a0 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
1e8b0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1e8c0 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
1e8d0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
1e8e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
1e8f0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1e900 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
1e910 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
1e920 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
1e930 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
1e940 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1e950 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
1e960 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
1e970 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
1e980 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
1e990 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
1e9a0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
1e9b0 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
1e9c0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1e9d0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1e9e0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
1e9f0 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
1ea00 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1ea10 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
1ea20 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
1ea30 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
1ea40 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
1ea50 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
1ea60 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
1ea70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ea80 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
1ea90 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
1eaa0 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
1eab0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
1eac0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
1ead0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
1eae0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1eaf0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1eb00 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
1eb10 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
1eb20 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
1eb30 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
1eb40 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
1eb50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eb60 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1eb70 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
1eb80 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1eb90 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
1eba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ebb0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1ebc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ebd0 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d 20     int exFlag = 
1ebe0 62 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31  bConcurrent ? -1
1ebf0 20 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20   : (wrflag>1);. 
1ec00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ec10 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1ec20 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c 61  t->pPager, exFla
1ec30 67 2c 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  g, sqlite3TempIn
1ec40 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1ec50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ec60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ec70 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1ec80 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1ec90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1eca0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f  rc==SQLITE_BUSY_
1ecb0 53 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d  SNAPSHOT && pBt-
1ecc0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ecd0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1ece0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68          /* if th
1ecf0 65 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73  ere was no trans
1ed00 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68  action opened wh
1ed10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ed20 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1ed30 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c  * called and SQL
1ed40 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
1ed50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63  T is returned, c
1ed60 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a  hange the error.
1ed70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1ed80 65 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59  e to SQLITE_BUSY
1ed90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1eda0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1edb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1edc0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1edd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ede0 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1edf0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1ee00 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1ee10 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1ee20 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1ee30 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ee40 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1ee50 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1ee60 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1ee70 72 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69  r(pBt) );.  sqli
1ee80 74 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63  te3PagerResetLoc
1ee90 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50  kTimeout(pBt->pP
1eea0 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63  ager);..  if( rc
1eeb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1eec0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1eed0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
1eee0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1eef0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
1ef00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ef10 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1ef20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
1ef30 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
1ef40 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
1ef50 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
1ef60 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
1ef70 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1ef80 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
1ef90 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
1efa0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
1efb0 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
1efc0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
1efd0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
1efe0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
1eff0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
1f000 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
1f010 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
1f020 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1f030 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1f040 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
1f050 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1f060 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
1f070 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1f080 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
1f090 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1f0a0 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
1f0b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1f0c0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1f0d0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
1f0e0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
1f0f0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
1f100 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
1f110 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
1f120 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
1f130 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
1f140 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1f150 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
1f160 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
1f170 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
1f180 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
1f190 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
1f1a0 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
1f1b0 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
1f1c0 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
1f1d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f1e0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
1f1f0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
1f200 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
1f210 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
1f220 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1f230 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
1f240 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
1f250 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
1f260 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
1f270 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
1f280 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
1f290 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
1f2a0 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
1f2b0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1f2c0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1f2d0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1f2e0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
1f2f0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
1f300 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1f310 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f320 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1f330 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1f340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f350 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1f360 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1f370 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1f380 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1f390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f3a0 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 23 69  .trans_begun:.#i
1f3b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f3c0 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
1f3d0 66 28 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 26  f( bConcurrent &
1f3e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f3f0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
1f400 73 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  sWal(pBt->pPager
1f410 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
1f420 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43  lite3PagerBeginC
1f430 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e 70  oncurrent(pBt->p
1f440 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1f450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f460 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1f470 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61   rc = btreePtrma
1f480 70 41 6c 6c 6f 63 61 74 65 28 70 42 74 29 3b 0a  pAllocate(pBt);.
1f490 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1f4a0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1f4b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1f4c0 20 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 20   pSchemaVersion 
1f4d0 29 7b 0a 20 20 20 20 20 20 2a 70 53 63 68 65 6d  ){.      *pSchem
1f4e0 61 56 65 72 73 69 6f 6e 20 3d 20 67 65 74 34 62  aVersion = get4b
1f4f0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f500 2d 3e 61 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20  ->aData[40]);.  
1f510 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1f520 61 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ag ){.      /* T
1f530 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
1f540 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
1f550 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
1f560 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
1f570 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
1f580 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
1f590 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1f5a0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
1f5b0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68   and.      ** th
1f5c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1f5d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1f5e0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1f5f0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1f600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f610 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt nSavepoint = 
1f620 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1f630 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  t;.      rc = sq
1f640 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1f650 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1f660 67 65 72 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29  ger, nSavepoint)
1f670 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f680 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61  SQLITE_OK && nSa
1f690 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20  vepoint ){.     
1f6a0 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
1f6b0 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20 6e 53  mapBegin(pBt, nS
1f6c0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
1f6d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1f6e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1f6f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1f700 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1f710 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1f720 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f730 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1f740 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1f750 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1f760 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1f770 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1f780 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1f790 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1f7a0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1f7b0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1f7c0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1f7d0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1f7e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1f7f0 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1f800 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1f810 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1f820 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1f830 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f850 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1f860 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1f870 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1f880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f890 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1f8a0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1f8b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1f8e0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1f8f0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1f900 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  Bt;.  Pgno pgno 
1f910 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1f920 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f930 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1f940 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1f950 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d  );.  rc = pPage-
1f960 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1f970 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1f980 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1f990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f9a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1f9b0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1f9c0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1f9d0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1f9e0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1f9f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1fa00 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1fa10 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1fa20 20 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26   pPage, pCell, &
1fa30 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1fa40 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1fa50 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1fa60 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1fa70 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1fa80 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1fa90 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1faa0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1fab0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1fac0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1fad0 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1fae0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1faf0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1fb00 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1fb10 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1fb20 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1fb30 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1fb40 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1fb50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fb60 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1fb70 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1fb80 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1fb90 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1fba0 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1fbb0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1fbc0 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1fbd0 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1fbe0 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1fbf0 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1fc00 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1fc10 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1fc20 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1fc30 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1fc40 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1fc50 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1fc60 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1fc70 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1fc80 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1fc90 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1fca0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1fcb0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1fcc0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1fcd0 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1fcf0 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1fd00 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1fd10 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1fd20 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1fd30 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1fd40 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1fd50 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1fd60 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1fd90 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1fda0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1fdb0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1fdc0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1fdd0 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1fde0 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1fdf0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1fe00 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1fe10 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1fe20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fe30 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1fe40 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1fe50 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1fe60 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1fe70 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1fe80 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1fe90 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1fea0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1feb0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1fec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1fed0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1fee0 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1fef0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ff00 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1ff10 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
1ff20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1ff30 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1ff40 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1ff50 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1ff60 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1ff70 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1ff80 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1ff90 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1ffa0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1ffb0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1ffc0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1ffd0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1ffe0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1fff0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
20000 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
20010 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
20020 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
20030 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
20040 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
20050 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
20060 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
20070 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
20080 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
20090 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
200a0 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
200b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
200c0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
200d0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
200e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
200f0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
20100 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20110 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
20120 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
20130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
20140 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  f( iFrom==get4by
20150 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
20160 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20  ize-4) ){.      
20170 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
20180 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
20190 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  4, iTo);.       
201a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
201b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
201c0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
201d0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
201e0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
201f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
20200 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
20210 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
20220 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
20230 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20240 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
20250 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
20260 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
20270 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
20280 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
20290 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
202a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
202b0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
202c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
202d0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
202e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
202f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
20300 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
20310 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
20320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20340 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
20350 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
20360 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
20370 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
20380 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
20390 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
203a0 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
203b0 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
203c0 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
203d0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
203e0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
203f0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
20400 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
20410 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
20420 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
20430 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
20440 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
20450 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
20460 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
20470 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
20480 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
20490 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
204a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
204b0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
204c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
204d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
204e0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
204f0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
20500 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
20510 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
20520 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
20530 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
20540 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
20550 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
20560 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
20570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
20580 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
20590 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
205a0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
205b0 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
205c0 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
205d0 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
205e0 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
205f0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
20600 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
20610 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
20620 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
20630 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
20640 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
20650 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
20660 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
20670 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
20680 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
20690 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
206a0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
206b0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
206c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
206d0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
206e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
206f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
20700 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
20710 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
20720 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
20730 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
20740 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
20750 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20760 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
20770 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
20780 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
20790 20 20 69 66 28 20 69 44 62 50 61 67 65 3c 33 20    if( iDbPage<3 
207a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
207b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
207c0 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
207d0 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
207e0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
207f0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
20800 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
20810 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
20820 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
20830 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
20840 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
20850 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
20860 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
20870 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
20880 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
20890 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
208a0 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
208b0 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
208c0 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
208d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
208e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
208f0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
20900 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
20910 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
20920 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
20930 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
20940 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
20950 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
20960 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
20970 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
20980 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
20990 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
209a0 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
209b0 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
209c0 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
209d0 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
209e0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
209f0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
20a00 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
20a10 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
20a20 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
20a30 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
20a40 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
20a50 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
20a60 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
20a70 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
20a80 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
20a90 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
20aa0 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
20ab0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
20ac0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
20ad0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
20ae0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
20af0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
20b00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
20b10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20b20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
20b30 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
20b40 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
20b50 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
20b60 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
20b70 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
20b80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
20b90 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
20ba0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
20bb0 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
20bc0 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
20bd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20be0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
20bf0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
20c00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
20c10 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
20c20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
20c30 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
20c40 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
20c50 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
20c60 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
20c70 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
20c80 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
20c90 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
20ca0 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
20cb0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
20cc0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
20cd0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
20ce0 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
20cf0 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
20d00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20d20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20d30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20d40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
20d50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20d60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20d80 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
20d90 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
20da0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20db0 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
20dc0 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
20dd0 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
20de0 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
20df0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
20e00 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
20e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20e20 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
20e30 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
20e40 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
20e50 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
20e60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20e70 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
20e80 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
20e90 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
20ea0 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
20eb0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
20ec0 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
20ed0 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
20ee0 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
20ef0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
20f00 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
20f10 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
20f20 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
20f30 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
20f40 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
20f50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
20f60 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
20f70 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
20f80 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
20f90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
20fa0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
20fb0 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
20fc0 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
20fd0 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
20fe0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
20ff0 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
21000 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
21010 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
21020 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
21030 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
21040 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
21050 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
21060 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
21070 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
21080 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
21090 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
210a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
210b0 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
210c0 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
210d0 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
210e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
210f0 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
21100 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
21110 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
21120 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
21130 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
21140 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
21150 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
21160 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
21170 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
21180 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
21190 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
211a0 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
211b0 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
211c0 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
211d0 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
211e0 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
211f0 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
21200 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
21210 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
21220 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
21230 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
21240 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
21250 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
21260 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
21270 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
21280 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
21290 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
212a0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
212b0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
212c0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
212d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
212e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
212f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
21300 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
21310 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
21320 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
21330 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
21340 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21350 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
21360 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
21370 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
21380 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
21390 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
213a0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
213b0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
213c0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
213d0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
213e0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
213f0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
21400 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
21410 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
21420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21430 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21440 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
21450 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
21460 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
21470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21480 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21490 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
214a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
214b0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
214c0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
214d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
214e0 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
214f0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
21500 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
21510 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
21520 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
21530 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
21540 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
21550 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
21560 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
21570 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
21580 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
21590 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
215a0 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
215b0 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
215c0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
215d0 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
215e0 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
215f0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
21600 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
21610 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
21620 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
21630 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
21640 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
21650 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
21660 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
21670 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21690 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
216a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
216b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
216c0 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
216d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
216e0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
216f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
21700 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
21710 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
21720 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
21730 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
21740 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
21750 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
21760 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
21770 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
21780 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
21790 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
217a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
217b0 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
217c0 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
217d0 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
217e0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
217f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
21800 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
21810 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
21820 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
21830 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
21840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
21860 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
21870 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
21880 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
21890 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
218a0 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
218b0 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
218c0 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
218d0 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
218e0 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
218f0 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
21900 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
21910 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
21920 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
21930 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
21940 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
21950 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
21960 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
21970 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
21980 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
21990 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
219a0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
219b0 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
219c0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
219d0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
219e0 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
219f0 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
21a00 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
21a10 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
21a20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
21a30 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
21a40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
21a50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
21a60 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
21a70 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
21a80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21aa0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
21ab0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
21ac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
21ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21ae0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21af0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
21b00 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
21b10 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
21b20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21b30 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
21b40 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
21b50 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
21b60 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
21b70 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
21b80 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
21b90 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
21ba0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
21bb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
21bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21bd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21bf0 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
21c00 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
21c10 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
21c20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
21c30 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
21c40 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
21c50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
21c60 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
21c70 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
21c80 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
21c90 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
21ca0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
21cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21cc0 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
21cd0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
21ce0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
21cf0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
21d00 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
21d10 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
21d20 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
21d30 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
21d40 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
21d50 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
21d60 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
21d70 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
21d80 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
21d90 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
21da0 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
21db0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
21dc0 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
21dd0 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
21de0 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
21df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21e00 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
21e10 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
21e20 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
21e30 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
21e40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21e50 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
21e60 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
21e70 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
21ea0 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
21eb0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
21ec0 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
21ed0 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
21ee0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
21ef0 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
21f00 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
21f10 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
21f20 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
21f30 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
21f40 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
21f50 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
21f60 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
21f70 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
21f80 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
21f90 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
21fa0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
21fb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21fc0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
21fd0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
21fe0 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
21ff0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
22000 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
22010 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
22020 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
22030 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
22040 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
22050 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
22060 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
22070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
22080 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
22090 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
220a0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
220b0 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
220c0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
220d0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
220e0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
220f0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
22100 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
22110 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
22120 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
22130 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
22140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22150 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
22160 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
22170 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
22180 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
22190 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
221a0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
221b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
221c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
221d0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
221e0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
221f0 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
22200 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
22210 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
22220 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
22230 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
22240 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
22250 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
22260 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
22270 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
22280 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
22290 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
222a0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
222b0 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
222c0 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
222d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
222e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
222f0 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
22300 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
22310 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
22320 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
22330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22340 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
22350 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
22360 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
22370 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
22380 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
22390 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
223a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
223b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
223c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
223d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
223e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
223f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
22400 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
22410 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
22420 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
22430 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
22440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22450 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
22460 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
22470 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22490 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
224a0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
224b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
224c0 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
224d0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
224e0 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
224f0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
22500 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
22510 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22520 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
22530 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
22540 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
22550 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
22560 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
22570 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
22580 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
22590 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
225a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
225b0 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
225c0 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
225d0 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
225e0 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
225f0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
22600 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
22610 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
22620 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
22630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
22640 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
22650 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
22660 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
22670 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
22680 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29  count(pPager); )
22690 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
226a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
226b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
226c0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
226d0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
226e0 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
226f0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
22700 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
22710 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
22720 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
22730 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
22740 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
22750 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
22760 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
22770 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
22780 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
22790 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
227a0 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
227b0 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
227c0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
227d0 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
227e0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
227f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
22800 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
22810 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
22820 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
22830 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
22840 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
22850 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
22860 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
22870 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
22880 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
22890 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
228a0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
228b0 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
228c0 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
228d0 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
228e0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
228f0 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
22900 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
22910 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
22920 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
22930 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
22940 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
22950 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22960 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22970 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
22980 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
22990 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
229a0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
229b0 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
229c0 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
229d0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
229e0 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
229f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22a00 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
22a10 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
22a20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
22a30 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
22a40 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
22a50 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
22a60 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
22a70 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
22a80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
22a90 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
22aa0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
22ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22ac0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
22ad0 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
22ae0 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
22af0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22b00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22b10 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
22b20 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
22b30 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
22b40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
22b50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
22b60 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
22b70 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
22b80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
22b90 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
22ba0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
22bb0 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
22bc0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
22bd0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
22be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22bf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
22c10 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
22c20 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
22c30 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
22c40 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
22c50 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
22c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22c70 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
22c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
22c90 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
22ca0 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
22cb0 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
22cc0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
22cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
22ce0 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69  URRENT./*.** Thi
22cf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22d00 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
22d10 6d 65 72 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55  merging an CONCU
22d20 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
22d30 6e 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e  n with.** the sn
22d40 61 70 73 68 6f 74 20 61 74 20 74 68 65 20 68 65  apshot at the he
22d50 61 64 20 6f 66 20 74 68 65 20 77 61 6c 20 66 69  ad of the wal fi
22d60 6c 65 2e 20 49 74 20 72 65 6c 6f 63 61 74 65 73  le. It relocates
22d70 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
22d80 65 0a 2a 2a 20 72 61 6e 67 65 20 69 46 69 72 73  e.** range iFirs
22d90 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73  t..iLast, inclus
22da0 69 76 65 2e 20 49 74 20 69 73 20 61 73 73 75 6d  ive. It is assum
22db0 65 64 20 74 68 61 74 20 74 68 65 20 42 74 72 65  ed that the Btre
22dc0 65 50 74 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75  ePtrmap .** stru
22dd0 63 74 75 72 65 20 61 74 20 42 74 53 68 61 72 65  cture at BtShare
22de0 64 2e 70 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20  d.pMap contains 
22df0 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
22e00 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  the pointers to 
22e10 65 61 63 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20  each.** page in 
22e20 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a  the range..**.**
22e30 20 49 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73   If pnCurrent is
22e40 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20   NULL, then all 
22e50 70 61 67 65 73 20 69 6e 20 74 68 65 20 72 61 6e  pages in the ran
22e60 67 65 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ge are moved to 
22e70 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65  currently.** fre
22e80 65 20 6c 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65  e locations (i.e
22e90 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72  . free-list entr
22ea0 69 65 73 29 20 77 69 74 68 69 6e 20 74 68 65 20  ies) within the 
22eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
22ec0 66 6f 72 65 20 70 61 67 65 0a 2a 2a 20 69 46 69  fore page.** iFi
22ed0 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  rst..**.** Or, i
22ee0 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 6e  f pnCurrent is n
22ef0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
22f00 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
22f10 75 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ue containing th
22f20 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 69 7a  e.** current siz
22f30 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22f40 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
22f50 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
22f60 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
22f70 72 65 6c 6f 63 61 74 65 64 20 74 6f 20 74 68 65  relocated to the
22f80 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
22f90 62 61 73 65 20 66 69 6c 65 20 2d 20 70 61 67 65  base file - page
22fa0 20 69 46 69 72 73 74 20 69 73 20 72 65 6c 6f 63   iFirst is reloc
22fb0 61 74 65 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20  ated to.** page 
22fc0 28 2a 70 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20  (*pnCurrent+1), 
22fd0 70 61 67 65 20 69 46 69 72 73 74 2b 31 20 74 6f  page iFirst+1 to
22fe0 20 70 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e   page (*pnCurren
22ff0 74 2b 32 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e  t+2), and so on.
23000 0a 2a 2a 20 56 61 6c 75 65 20 2a 70 6e 43 75 72  .** Value *pnCur
23010 72 65 6e 74 20 69 73 20 73 65 74 20 74 6f 20 74  rent is set to t
23020 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
23030 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
23040 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
23050 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
23060 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  .** If no error 
23070 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f  occurs, SQLITE_O
23080 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
23090 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
230a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
230b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
230c0 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
230d0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
230e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
230f0 20 20 20 20 2f 2a 20 42 2d 74 72 65 65 20 68 61      /* B-tree ha
23100 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ndle */.  Pgno i
23110 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
23120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23130 73 74 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63  st page to reloc
23140 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c  ate */.  Pgno iL
23150 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ast,            
23160 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
23170 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74   page to relocat
23180 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43  e */.  Pgno *pnC
23190 75 72 72 65 6e 74 20 20 20 20 20 20 20 20 20 20  urrent          
231a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
231b0 20 4e 55 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44   NULL, IN/OUT: D
231c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
231d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
231e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
231f0 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
23200 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
23210 20 69 50 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67   iPg;..  for(iPg
23220 3d 69 46 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c  =iFirst; iPg<=iL
23230 61 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ast && rc==SQLIT
23240 45 5f 4f 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  E_OK; iPg++){.  
23250 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
23260 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 61 67   = 0;     /* Pag
23270 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d  e allocated from
23280 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
23290 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
232a0 20 30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   0;.    Pgno iNe
232b0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
232c0 2f 2a 20 4e 65 77 20 70 61 67 65 20 6e 75 6d 62  /* New page numb
232d0 65 72 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20  er for pPg */.  
232e0 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70    PtrmapEntry *p
232f0 45 6e 74 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69  Entry;    /* Poi
23300 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
23310 6f 72 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a  or page iPg */..
23320 20 20 20 20 69 66 28 20 69 50 67 3d 3d 50 45 4e      if( iPg==PEN
23330 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
23340 42 74 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Bt) ) continue;.
23350 20 20 20 20 70 45 6e 74 72 79 20 3d 20 26 70 4d      pEntry = &pM
23360 61 70 2d 3e 61 50 74 72 5b 69 50 67 20 2d 20 70  ap->aPtr[iPg - p
23370 4d 61 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20  Map->iFirst];.. 
23380 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 65     if( pEntry->e
23390 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
233a0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 50  EPAGE ){.      P
233b0 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  gno dummy;.     
233c0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
233d0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
233e0 72 65 65 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67  ree, &dummy, iPg
233f0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
23400 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
23410 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
23420 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
23430 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 46  rPageRefcount(pF
23440 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31  ree->pDbPage)==1
23450 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23460 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 46  te3PcacheDrop(pF
23470 72 65 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ree->pDbPage);. 
23480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
23490 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
234a0 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67  OK || dummy==iPg
234b0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
234c0 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20  ( pnCurrent ){. 
234d0 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
234e0 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
234f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
23500 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
23510 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 67 2d  Iswriteable(pPg-
23520 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
23530 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
23540 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
23550 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67 65  unt(pPg->pDbPage
23560 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4e  )==1 );.      iN
23570 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
23580 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nt);.      if( i
23590 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  New==PENDING_BYT
235a0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 69 4e  E_PAGE(pBt) ) iN
235b0 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
235c0 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
235d0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
235e0 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65  , pPg, pEntry->e
235f0 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61  Type, pEntry->pa
23600 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a  rent, iNew, 1);.
23610 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
23620 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  eNotNull(pPg);. 
23630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23640 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
23650 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
23660 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72 73  ee, &iNew, iFirs
23670 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29  t-1, BTALLOC_LE)
23680 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
236a0 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b 0a   iNew<iFirst );.
236b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
236c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
236d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
236e0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Free);.        b
236f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
23700 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a   iPg, &pPg, 0);.
23710 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
23720 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
23730 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
23740 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
23750 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20  t,iNew,1);.     
23760 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
23770 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
23780 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23790 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e  rc;.}../* !defin
237a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
237b0 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
237c0 20 54 68 65 20 62 2d 74 72 65 65 20 68 61 6e 64   The b-tree hand
237d0 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
237e0 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
237f0 73 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69  s about to commi
23800 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45  t an.** CONCURRE
23810 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  NT transaction. 
23820 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
23830 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
23840 68 61 74 20 74 68 69 73 20 69 73 20 0a 2a 2a 20  hat this is .** 
23850 70 6f 73 73 69 62 6c 65 20 2d 20 74 68 65 20 77  possible - the w
23860 61 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 69  al WRITER lock i
23870 73 20 68 65 6c 64 20 61 6e 64 20 69 74 20 69 73  s held and it is
23880 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 72   known that ther
23890 65 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e  e are .** no con
238a0 66 6c 69 63 74 73 20 77 69 74 68 20 63 6f 6d 6d  flicts with comm
238b0 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
238c0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
238d0 74 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b  t btreeFixUnlock
238e0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
238f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23900 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
23910 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
23920 3e 70 50 61 67 65 31 3b 0a 20 20 75 38 20 2a 70  >pPage1;.  u8 *p
23930 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
23940 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
23950 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
23960 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23970 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
23980 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
23990 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 77  atabase is not w
239a0 72 69 74 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f  ritable, then no
239b0 20 70 61 67 65 73 20 77 65 72 65 20 61 6c 6c 6f   pages were allo
239c0 63 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72  cated.  ** or fr
239d0 65 65 64 20 62 79 20 74 68 69 73 20 74 72 61 6e  eed by this tran
239e0 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
239f0 20 63 61 73 65 20 6e 6f 20 73 70 65 63 69 61 6c   case no special
23a00 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20   handling is .  
23a10 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  ** required. Oth
23a20 65 72 77 69 73 65 2c 20 69 66 20 70 61 67 65 20  erwise, if page 
23a30 31 20 69 73 20 64 69 72 74 79 2c 20 70 72 6f 63  1 is dirty, proc
23a40 65 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65  eed.  */.  Btree
23a50 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
23a60 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
23a70 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
23a80 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50  te(&p1[32]);.  P
23a90 67 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74 72 65  gno nPage = btre
23aa0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
23ab0 0a 20 20 75 33 32 20 6e 46 72 65 65 20 3d 20 67  .  u32 nFree = g
23ac0 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29  et4byte(&p1[36])
23ad0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
23ae0 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d  ->pMap );.  rc =
23af0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67   sqlite3PagerUpg
23b00 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61  radeSnapshot(pPa
23b10 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62  ger, pPage1->pDb
23b20 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
23b30 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61   p1==pPage1->aDa
23b40 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ta );..  if( rc=
23b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23b60 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20    Pgno nHPage = 
23b70 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  get4byte(&p1[28]
23b80 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
23b90 20 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20 20   = nHPage;      
23ba0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
23bb0 20 61 66 74 65 72 20 74 72 61 6e 73 61 63 74 69   after transacti
23bc0 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20  on merge */..   
23bd0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
23be0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
23bf0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 7b  ge1->pDbPage) ){
23c00 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54 72  .      Pgno iHTr
23c10 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
23c20 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 75  p1[32]);.      u
23c30 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74 34  32 nHFree = get4
23c40 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
23c50 20 20 20 20 20 20 62 74 72 65 65 50 74 72 6d 61        btreePtrma
23c60 70 43 68 65 63 6b 28 70 42 74 2c 20 6e 50 61 67  pCheck(pBt, nPag
23c70 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74  e);..      /* At
23c80 74 61 63 68 20 74 68 65 20 68 65 61 64 20 64 61  tach the head da
23c90 74 61 62 61 73 65 20 66 72 65 65 20 6c 69 73 74  tabase free list
23ca0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
23cb0 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
23cc0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
23cd0 20 66 72 65 65 2d 6c 69 73 74 20 28 69 66 20 61   free-list (if a
23ce0 6e 79 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ny).  */.      i
23cf0 66 28 20 69 54 72 75 6e 6b 21 3d 30 20 29 7b 0a  f( iTrunk!=0 ){.
23d00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
23d10 28 26 70 31 5b 33 36 5d 2c 20 6e 48 46 72 65 65  (&p1[36], nHFree
23d20 20 2b 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 20   + nFree);.     
23d30 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b     put4byte(&p1[
23d40 33 32 5d 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  32], iTrunk);.  
23d50 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 54 72        while( iTr
23d60 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
23d70 20 44 62 50 61 67 65 20 2a 70 54 72 75 6e 6b 20   DbPage *pTrunk 
23d80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
23d90 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 54 72  okup(pPager, iTr
23da0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
23db0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
23dc0 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70  e((u8*)pTrunk->p
23dd0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
23de0 20 69 66 28 20 69 54 72 75 6e 6b 3d 3d 30 20 29   if( iTrunk==0 )
23df0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
23e00 74 34 62 79 74 65 28 28 75 38 2a 29 70 54 72 75  t4byte((u8*)pTru
23e10 6e 6b 2d 3e 70 44 61 74 61 2c 20 69 48 54 72 75  nk->pData, iHTru
23e20 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
23e30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23e40 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 72  e3PagerUnref(pTr
23e50 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b  unk);.        };
23e60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23e70 69 66 28 20 6e 48 50 61 67 65 3c 28 70 4d 61 70  if( nHPage<(pMap
23e80 2d 3e 69 46 69 72 73 74 2d 31 29 20 29 7b 0a 20  ->iFirst-1) ){. 
23e90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
23ea0 74 61 62 61 73 65 20 63 6f 6e 73 69 73 74 65 64  tabase consisted
23eb0 20 6f 66 20 28 70 4d 61 70 2d 3e 69 46 69 72 73   of (pMap->iFirs
23ec0 74 2d 31 29 20 70 61 67 65 73 20 77 68 65 6e 20  t-1) pages when 
23ed0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20  the current.    
23ee0 20 20 20 20 2a 2a 20 63 6f 6e 63 75 72 72 65 6e      ** concurren
23ef0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
23f00 73 20 6f 70 65 6e 65 64 2e 20 41 6e 64 20 61 6e  s opened. And an
23f10 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
23f20 73 61 63 74 69 6f 6e 20 6d 61 79 0a 20 20 20 20  saction may.    
23f30 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 65 78      ** not be ex
23f40 65 63 75 74 65 64 20 6f 6e 20 61 6e 20 61 75 74  ecuted on an aut
23f50 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
23f60 65 20 2d 20 73 6f 20 74 68 65 20 64 62 20 73 68  e - so the db sh
23f70 6f 75 6c 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  ould .        **
23f80 20 6e 6f 74 20 68 61 76 65 20 73 68 72 75 6e 6b   not have shrunk
23f90 20 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73   since the trans
23fa0 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
23fb0 64 2e 20 54 68 65 72 65 66 6f 72 65 20 6e 48 50  d. Therefore nHP
23fc0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  age.        ** s
23fd0 68 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20  hould be set to 
23fe0 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29  (pMap->iFirst-1)
23ff0 20 6f 72 20 67 72 65 61 74 65 72 2e 20 2a 2f 0a   or greater. */.
24000 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24010 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
24020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24030 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
24040 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
24050 6e 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  n allocated page
24060 73 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 74  s pMap->iFirst t
24070 68 72 6f 75 67 68 0a 20 20 20 20 20 20 20 20 2a  hrough.        *
24080 2a 20 6e 50 61 67 65 20 28 69 6e 63 6c 75 73 69  * nPage (inclusi
24090 76 65 29 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ve) at the end o
240a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
240b0 69 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a  ile. Meanwhile,.
240c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
240d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68 61   transactions ha
240e0 76 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 46  ve allocated (iF
240f0 69 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53  irst..nHPage). S
24100 6f 20 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  o move.        *
24110 2a 20 70 61 67 65 73 20 28 69 46 69 72 73 74 2e  * pages (iFirst.
24120 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67  .MIN(nPage,nHPag
24130 65 29 29 20 74 6f 20 28 4d 41 58 28 6e 50 61 67  e)) to (MAX(nPag
24140 65 2c 6e 48 50 61 67 65 29 2b 31 29 2e 20 2a 2f  e,nHPage)+1). */
24150 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4c  .        Pgno iL
24160 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c  ast = MIN(nPage,
24170 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f 2a 20   nHPage);    /* 
24180 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d 6f 76  Last page to mov
24190 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e  e */.        Pgn
241a0 6f 20 6e 43 75 72 72 65 6e 74 3b 20 20 20 20 20  o nCurrent;     
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
241d0 20 6f 66 20 64 62 20 2a 2f 0a 0a 20 20 20 20 20   of db */..     
241e0 20 20 20 6e 43 75 72 72 65 6e 74 20 3d 20 4d 41     nCurrent = MA
241f0 58 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29  X(nPage, nHPage)
24200 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
24210 50 61 67 65 20 3d 20 6e 43 75 72 72 65 6e 74 3b  Page = nCurrent;
24220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
24230 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
24240 28 70 42 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72  (pBt, pMap->iFir
24250 73 74 2c 20 69 4c 61 73 74 2c 20 26 6e 43 75 72  st, iLast, &nCur
24260 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  rent);..        
24270 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77  /* There are now
24280 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77   no collisions w
24290 69 74 68 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ith the snapshot
242a0 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 20   at the head of 
242b0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
242c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
242d0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
242e0 74 20 77 6f 75 6c 64 20 62 65 20 70 6f 73 73 69  t would be possi
242f0 62 6c 65 20 74 6f 20 77 72 69 74 65 0a 20 20 20  ble to write.   
24300 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e       ** the tran
24310 73 61 63 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  saction out to d
24320 69 73 6b 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  isk. Before doin
24330 67 20 73 6f 20 74 68 6f 75 67 68 2c 20 61 74 74  g so though, att
24340 65 6d 70 74 20 74 6f 0a 20 20 20 20 20 20 20 20  empt to.        
24350 2a 2a 20 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65  ** relocate some
24360 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61 67 65   of the new page
24370 73 20 74 6f 20 66 72 65 65 20 6c 6f 63 61 74 69  s to free locati
24380 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 62  ons within the b
24390 6f 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ody.        ** o
243a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
243b0 69 6c 65 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c  ile (i.e. free-l
243c0 69 73 74 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f  ist entries). */
243d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
243e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
243f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24400 6e 43 75 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e  nCurrent!=PENDIN
24410 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
24420 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
24430 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73  lite3PagerSetDbs
24440 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
24450 20 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   nCurrent);.    
24460 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65        nFree = ge
24470 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b  t4byte(&p1[36]);
24480 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20  .          nFin 
24490 3d 20 6e 43 75 72 72 65 6e 74 2d 6e 46 72 65 65  = nCurrent-nFree
244a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
244b0 6e 43 75 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47  nCurrent>PENDING
244c0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
244d0 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
244e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
244f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
24500 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Fin--;.         
24510 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69   }.          nFi
24520 6e 20 3d 20 4d 41 58 28 6e 46 69 6e 2c 20 6e 48  n = MAX(nFin, nH
24530 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24540 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f 63   rc = btreeReloc
24550 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 6e 46  ateRange(pBt, nF
24560 69 6e 2b 31 2c 20 6e 43 75 72 72 65 6e 74 2c 20  in+1, nCurrent, 
24570 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  0);.        }.. 
24580 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
24590 26 70 31 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  &p1[28], nFin);.
245a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
245b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
245c0 74 44 62 73 69 7a 65 28 70 50 61 67 65 72 2c 20  tDbsize(pPager, 
245d0 6e 46 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  nFin);.  }..  re
245e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
245f0 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 46  .# define btreeF
24600 69 78 55 6e 6c 6f 63 6b 65 64 28 58 29 20 20 53  ixUnlocked(X)  S
24610 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20  QLITE_OK.#endif 
24620 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
24630 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a  ONCURRENT */../*
24640 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24650 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
24660 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
24670 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
24680 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
24690 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
246a0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
246b0 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
246c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
246d0 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
246e0 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
246f0 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
24700 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
24710 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
24720 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
24730 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
24740 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
24750 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
24760 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
24770 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
24780 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
24790 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
247a0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
247b0 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
247c0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
247d0 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
247e0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
247f0 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
24800 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
24820 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
24830 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
24840 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
24850 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
24860 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
24870 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
24880 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
24890 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
248a0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
248b0 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
248c0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
248d0 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
248e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
248f0 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
24900 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
24910 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
24920 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
24930 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
24940 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
24950 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
24960 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
24970 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
24980 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
24990 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
249a0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
249b0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
249c0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
249d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
249e0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
249f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
24a00 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
24a10 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
24a20 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
24a30 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
24a40 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
24a50 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
24a60 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
24a70 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
24a80 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
24a90 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
24aa0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
24ab0 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
24ac0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
24ad0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
24ae0 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
24af0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
24b00 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
24b10 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
24b20 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
24b30 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
24b40 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
24b50 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
24b60 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
24b70 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
24b80 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
24b90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24ba0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
24bb0 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
24bc0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
24bd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24be0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
24bf0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
24c00 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
24c10 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
24c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24c30 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66  eeEnter(p);..#if
24c40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24c50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
24c60 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
24c70 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  uum ){.      ass
24c80 65 72 74 28 20 49 53 43 4f 4e 43 55 52 52 45 4e  ert( ISCONCURREN
24c90 54 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  T==0 );.      rc
24ca0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
24cb0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
24cc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24cd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
24ce0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
24cf0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
24d00 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
24d10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
24d20 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
24d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24d40 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
24d50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
24d60 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
24d70 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
24d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24d90 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 7b 0a  ISCONCURRENT ){.
24da0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24db0 46 69 78 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a  FixUnlocked(p);.
24dc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
24dd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24de0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24df0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
24e00 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
24e10 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
24e20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24e30 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24e40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24e50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24e60 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24e70 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
24e80 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
24e90 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
24ea0 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
24eb0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
24ec0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
24ed0 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
24ee0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
24ef0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
24f00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24f10 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
24f20 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
24f30 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24f40 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
24f50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24f60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24f70 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
24f80 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
24f90 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
24fa0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
24fb0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
24fc0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
24fd0 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
24fe0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
24ff0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
25000 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
25010 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
25020 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
25030 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
25040 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
25050 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
25060 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
25070 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
25080 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
25090 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
250a0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
250b0 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
250c0 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
250d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
250e0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
250f0 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
25100 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
25110 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
25120 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
25130 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
25140 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
25150 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25160 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
25170 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
25180 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
25190 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
251a0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
251b0 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
251c0 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
251d0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
251e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
251f0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
25200 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
25210 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
25220 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
25230 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
25240 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
25250 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
25260 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
25270 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
25280 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
25290 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
252a0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
252b0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
252c0 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
252d0 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
252e0 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
252f0 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
25300 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
25310 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
25320 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
25330 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
25340 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
25350 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
25360 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
25370 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
25380 77 61 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e  was an CONCURREN
25390 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  T transaction, d
253a0 65 6c 65 74 65 20 74 68 65 20 70 42 74 2d 3e 70  elete the pBt->p
253b0 4d 61 70 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  Map object..  **
253c0 20 41 6c 73 6f 20 63 61 6c 6c 20 50 61 67 65 72   Also call Pager
253d0 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 29 20  EndConcurrent() 
253e0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
253f0 68 65 20 70 61 67 65 72 20 68 61 73 20 64 69 73  he pager has dis
25400 63 61 72 64 65 64 0a 20 20 2a 2a 20 74 68 65 20  carded.  ** the 
25410 72 65 63 6f 72 64 20 6f 66 20 61 6c 6c 20 70 61  record of all pa
25420 67 65 73 20 72 65 61 64 20 77 69 74 68 69 6e 20  ges read within 
25430 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
25440 20 20 2a 2f 0a 20 20 62 74 72 65 65 50 74 72 6d    */.  btreePtrm
25450 61 70 44 65 6c 65 74 65 28 70 42 74 29 3b 0a 20  apDelete(pBt);. 
25460 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 6e 64   sqlite3PagerEnd
25470 43 6f 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e  Concurrent(pBt->
25480 70 50 61 67 65 72 29 3b 0a 20 20 62 74 72 65 65  pPager);.  btree
25490 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
254a0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
254b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
254c0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
254d0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
254e0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
254f0 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
25500 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
25510 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
25520 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
25530 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
25540 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
25550 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
25560 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
25570 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
25580 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
25590 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
255a0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
255b0 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
255c0 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
255d0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
255e0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
255f0 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
25600 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
25610 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
25620 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
25630 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
25640 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
25650 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
25660 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
25670 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
25680 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
25690 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
256a0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
256b0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
256c0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
256d0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
256e0 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
256f0 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
25700 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
25710 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
25720 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
25730 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
25740 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
25750 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
25760 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
25770 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
25780 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
25790 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
257a0 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
257b0 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
257c0 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
257d0 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
257e0 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
257f0 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
25800 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
25810 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
25820 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
25830 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
25840 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
25850 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
25860 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
25870 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
25880 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
25890 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
258a0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
258b0 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
258c0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
258d0 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
258e0 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
258f0 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
25900 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
25910 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
25920 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
25930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
25940 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
25950 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
25960 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
25970 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
25980 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
25990 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
259a0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
259b0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
259c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
259d0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
259e0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
259f0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
25a00 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
25a10 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
25a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25a30 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
25a40 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
25a50 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
25a60 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
25a70 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
25a80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
25a90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25aa0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
25ab0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
25ac0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
25ad0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
25ae0 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
25af0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
25b00 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
25b10 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
25b20 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
25b30 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
25b40 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
25b50 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
25b60 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
25b70 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
25b80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
25b90 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
25ba0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
25bb0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
25bc0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
25bd0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
25be0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25bf0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
25c00 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
25c10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25c20 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
25c30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
25c40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25c50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25c60 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
25c70 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
25c80 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
25c90 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
25ca0 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
25cb0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
25cc0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
25cd0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
25ce0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
25cf0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
25d00 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
25d10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
25d20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
25d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25d40 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
25d50 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
25d60 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
25d70 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
25d80 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
25d90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
25da0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
25db0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
25dc0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
25dd0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
25df0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
25e00 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
25e10 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
25e20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
25e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25e40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25e50 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
25e60 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
25e70 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
25e80 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
25e90 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
25ea0 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
25eb0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
25ec0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
25ed0 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
25ee0 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
25ef0 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
25f00 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
25f10 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
25f20 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
25f30 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
25f40 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
25f50 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
25f60 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
25f70 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
25f80 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
25f90 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
25fa0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
25fb0 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
25fc0 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
25fd0 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
25fe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25ff0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
26000 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
26010 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
26020 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
26030 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
26040 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
26050 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
26060 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
26070 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
26080 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
26090 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
260a0 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
260b0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
260c0 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
260d0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
260e0 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
260f0 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
26100 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
26110 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
26120 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
26130 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
26140 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
26150 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
26160 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
26170 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
26180 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
26190 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
261a0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
261b0 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
261c0 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
261d0 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
261e0 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
261f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
26200 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
26210 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
26220 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
26230 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
26240 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
26250 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
26260 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
26270 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
26280 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
26290 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
262a0 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
262b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
262c0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
262d0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
262e0 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
262f0 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
26300 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
26310 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
26320 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
26330 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
26340 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
26350 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
26360 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
26370 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
26380 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26390 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
263a0 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
263b0 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
263c0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
263d0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
263e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
263f0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
26400 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
26410 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
26420 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
26430 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69  ){.      if( wri
26440 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75  teOnly && (p->cu
26450 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
26460 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20  iteFlag)==0 ){. 
26470 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53         if( p->eS
26480 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26490 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
264a0 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
264b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
264c0 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
264d0 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
264e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
264f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26500 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
26510 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
26520 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63  rsors(pBtree, rc
26530 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26540 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26570 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
26580 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
26590 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
265a0 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
265b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69  ;.        p->ski
265c0 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
265d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
265e0 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
265f0 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20  rsorPages(p);.  
26600 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
26610 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
26620 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
26640 20 74 68 65 20 70 42 74 2d 3e 6e 50 61 67 65 20   the pBt->nPage 
26650 66 69 65 6c 64 20 63 6f 72 72 65 63 74 6c 79 2c  field correctly,
26660 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
26670 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 73 74 61  e current.** sta
26680 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  te of the databa
26690 73 65 2e 20 20 41 73 73 75 6d 65 20 70 42 74 2d  se.  Assume pBt-
266a0 3e 70 50 61 67 65 31 20 69 73 20 76 61 6c 69 64  >pPage1 is valid
266b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
266c0 20 62 74 72 65 65 53 65 74 4e 50 61 67 65 28 42   btreeSetNPage(B
266d0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
266e0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 29 7b 0a  mPage *pPage1){.
266f0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
26700 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26710 61 44 61 74 61 5b 32 38 5d 29 3b 0a 20 20 74 65  aData[28]);.  te
26720 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
26730 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   );.  if( nPage=
26740 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
26750 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
26760 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
26770 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74  .  testcase( pBt
26780 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
26790 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
267a0 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nPage;.}../*.**
267b0 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
267c0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
267d0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
267e0 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
267f0 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
26800 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
26810 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
26820 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
26830 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
26840 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
26850 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
26860 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
26870 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
26880 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
26890 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
268a0 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
268b0 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
268c0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
268d0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
268e0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
268f0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
26900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26910 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
26920 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
26930 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
26940 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
26950 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
26960 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
26970 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
26980 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
26990 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
269a0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
269b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
269c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
269d0 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
269e0 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
269f0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
26a00 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
26a10 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
26a20 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
26a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
26a40 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
26a50 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
26a60 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
26a70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
26a80 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
26a90 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
26aa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
26ab0 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
26ac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26ad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26ae0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
26af0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
26b00 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
26b10 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
26b20 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
26b30 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
26b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
26b50 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
26b60 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
26b70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
26b80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
26b90 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
26ba0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
26bb0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
26bc0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
26bd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
26be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
26bf0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
26c00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
26c10 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
26c20 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
26c30 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
26c40 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
26c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
26c60 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
26c70 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
26c80 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
26c90 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
26ca0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
26cb0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
26cc0 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
26cd0 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
26ce0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
26cf0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
26d00 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
26d10 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
26d20 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
26d30 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
26d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26d50 20 62 74 72 65 65 53 65 74 4e 50 61 67 65 28 70   btreeSetNPage(p
26d60 42 74 2c 20 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt, pPage1);.   
26d70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
26d80 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
26d90 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
26da0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
26db0 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
26dc0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
26dd0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
26de0 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
26df0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
26e00 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
26e10 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
26e20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
26e30 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
26e40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
26e50 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
26e60 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
26e70 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
26e80 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
26e90 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
26ea0 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
26eb0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
26ec0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
26ed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
26ee0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
26ef0 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
26f00 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
26f10 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
26f20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
26f30 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
26f40 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
26f50 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
26f60 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
26f70 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
26f80 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
26f90 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
26fa0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
26fb0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
26fc0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
26fd0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
26fe0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
26ff0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
27000 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
27010 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
27020 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
27030 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
27040 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
27050 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
27060 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
27070 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
27080 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
27090 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
270a0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
270b0 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
270c0 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
270d0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
270e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
270f0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
27100 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
27110 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
27120 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
27130 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
27140 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
27150 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
27160 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
27170 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
27180 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
27190 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
271a0 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
271b0 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
271c0 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
271d0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
271e0 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
271f0 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
27200 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
27210 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
27220 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
27230 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
27240 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
27250 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
27260 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
27270 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
27280 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
27290 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
272a0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
272b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
272c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
272d0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
272e0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
272f0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
27300 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
27310 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
27320 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
27330 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
27340 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
27350 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
27360 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
27370 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
27380 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
27390 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
273a0 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
273b0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
273c0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
273d0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
273e0 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
273f0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
27400 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
27410 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
27420 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
27430 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
27440 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
27450 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
27460 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
27470 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
27480 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27490 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
274a0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
274b0 65 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ement);.  if( rc
274c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
274d0 20 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72     rc = btreePtr
274e0 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20 69 53  mapBegin(pBt, iS
274f0 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  tatement);.  }. 
27500 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
27510 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
27520 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
27530 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27540 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
27550 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
27560 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
27570 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
27580 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
27590 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
275a0 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
275b0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
275c0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
275d0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
275e0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
275f0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
27600 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
27610 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
27620 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
27630 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
27640 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
27650 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
27660 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
27670 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
27680 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
27690 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
276a0 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
276b0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
276c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
276d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
276e0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
276f0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
27700 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
27710 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
27720 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
27730 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
27740 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
27750 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
27760 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
27770 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
27780 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
27790 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
277a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
277b0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
277c0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
277d0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
277e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
277f0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
27800 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
27810 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
27820 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
27830 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
27840 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
27850 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
27860 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
27870 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
27880 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
27890 3b 0a 20 20 20 20 62 74 72 65 65 50 74 72 6d 61  ;.    btreePtrma
278a0 70 45 6e 64 28 70 42 74 2c 20 6f 70 2c 20 69 53  pEnd(pBt, op, iS
278b0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
278c0 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
278d0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
278e0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
278f0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
27900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27920 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
27930 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
27940 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
27950 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
27960 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
27970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27980 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
27990 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
279a0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
279b0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
279c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
279d0 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
279e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
279f0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
27a00 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 53 65  );.      btreeSe
27a10 74 4e 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  tNPage(pBt, pBt-
27a20 3e 70 50 61 67 65 31 29 3b 0a 0a 20 20 20 20 20  >pPage1);..     
27a30 20 2f 2a 20 70 42 74 2d 3e 6e 50 61 67 65 20 6d   /* pBt->nPage m
27a40 69 67 68 74 20 62 65 20 7a 65 72 6f 20 69 66 20  ight be zero if 
27a50 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
27a60 20 63 6f 72 72 75 70 74 20 77 68 65 6e 20 0a 20   corrupt when . 
27a70 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e       ** the tran
27a80 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
27a90 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
27aa0 69 74 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  it must be at le
27ab0 61 73 74 20 31 2e 20 20 2a 2f 0a 20 20 20 20 20  ast 1.  */.     
27ac0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
27ad0 5f 44 42 20 7c 7c 20 70 42 74 2d 3e 6e 50 61 67  _DB || pBt->nPag
27ae0 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e>0 );.    }.   
27af0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
27b00 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
27b10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27b20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
27b30 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
27b40 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
27b50 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
27b60 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61  iTable. If a rea
27b70 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73  d-only cursor is
27b80 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
27b90 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
27ba0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72  * the caller alr
27bb0 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73  eady has at leas
27bc0 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  t a read-only tr
27bd0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a  ansaction open.*
27be0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
27bf0 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20  e already. If a 
27c00 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
27c10 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a  requested, then.
27c20 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
27c30 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
27c40 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
27c50 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
27c60 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57  * If the BTREE_W
27c70 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c  RCSR bit of wrFl
27c80 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65  ag is clear, the
27c90 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
27ca0 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64   only.** be used
27cb0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49   for reading.  I
27cc0 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53  f the BTREE_WRCS
27cd0 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68  R bit is set, th
27ce0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  en the cursor.**
27cf0 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
27d00 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20   reading or for 
27d10 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
27d20 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
27d30 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61  writing.** are a
27d40 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20  lso met.  These 
27d50 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
27d60 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
27d70 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  met in order.** 
27d80 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62  for writing to b
27d90 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
27da0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
27db0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
27dc0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
27dd0 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52  g containing BTR
27de0 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32  EE_WRCSR.**.** 2
27df0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
27e00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
27e10 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
27e20 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
27e30 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
27e40 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
27e50 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
27e60 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
27e70 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
27e80 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
27e90 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
27ea0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
27eb0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
27ec0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
27ed0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
27ee0 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
27ef0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
27f00 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
27f10 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
27f20 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
27f30 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
27f40 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
27f50 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
27f60 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
27f70 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
27f80 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
27f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
27fa0 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f  .** The BTREE_FO
27fb0 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77  RDELETE bit of w
27fc0 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e  rFlag may option
27fd0 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42  ally be set if B
27fe0 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73  TREE_WRCSR.** is
27ff0 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c   set.  If FORDEL
28000 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74  ETE is set, that
28010 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
28020 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28030 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75   that.** this cu
28040 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62  rsor will only b
28050 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74  e used to seek t
28060 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74  o and delete ent
28070 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78  ries of an index
28080 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61  .** as part of a
28090 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73   larger DELETE s
280a0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46  tatement.  The F
280b0 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73  ORDELETE hint is
280c0 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20   not used by.** 
280d0 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
280e0 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68  ion.  But in a h
280f0 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65  ypothetical alte
28100 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20  rnative storage 
28110 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68  engine .** in wh
28120 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65  ich index entrie
28130 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
28140 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
28150 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
28160 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65  able.** rows are
28170 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f   deleted, the FO
28180 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20  RDELETE flag is 
28190 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20  a hint that all 
281a0 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a  SEEK and DELETE.
281b0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e  ** operations on
281c0 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e   this cursor can
281d0 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61   be no-ops and a
281e0 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f  ll READ operatio
281f0 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72  ns can .** retur
28200 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d  n a null row (2-
28210 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30  bytes: 0x01 0x00
28220 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  )..**.** No chec
28230 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
28240 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
28250 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
28260 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
28270 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
28280 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
28290 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
282a0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
282b0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
282c0 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
282d0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
282e0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
282f0 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
28300 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
28310 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
28320 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
28330 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
28340 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
28350 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
28360 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
28370 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
283a0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
283b0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
283e0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
283f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
28400 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28420 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
28430 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
28440 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
28450 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
28460 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
28470 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
28480 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
28490 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284b0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
284c0 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
284d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
284e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
284f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28500 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
28510 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  dle */.  BtCurso
28520 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  r *pX;          
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  /* Looping over 
28550 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72  other all cursor
28560 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
28570 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
28580 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
28590 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
285a0 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
285b0 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20  ag==BTREE_WRCSR 
285c0 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
285d0 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c  g==(BTREE_WRCSR|
285e0 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29  BTREE_FORDELETE)
285f0 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65   .  );..  /* The
28600 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
28610 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
28620 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
28630 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
28640 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
28650 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
28660 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
28670 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
28680 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
28690 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
286a0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
286b0 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
286c0 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
286d0 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
286e0 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
286f0 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
28700 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
28710 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
28720 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29  =0, (wrFlag?2:1)
28730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
28740 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73  rFlag==0 || !has
28750 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
28760 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f   iTable) );..  /
28770 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
28780 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65  e caller has ope
28790 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ned the required
287a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
287b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
287c0 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
287d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
287e0 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e  Flag==0 || p->in
287f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
28800 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
28810 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70  pBt->pPage1 && p
28820 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
28830 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  a );.  assert( w
28840 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74  rFlag==0 || (pBt
28850 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
28860 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
28870 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20  ;..  if( wrFlag 
28880 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  ){.    allocateT
28890 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
288a0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
288b0 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
288c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
288d0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  KPT;.  }.  if( i
288e0 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
288f0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
28900 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
28910 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
28920 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
28930 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
28940 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
28950 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
28960 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
28970 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
28980 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
28990 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
289a0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
289b0 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
289c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
289d0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
289e0 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
289f0 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
28a00 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
28a10 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
28a20 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
28a30 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46  Bt;.  pCur->curF
28a40 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20  lags = wrFlag ? 
28a50 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a  BTCF_WriteFlag :
28a60 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50   0;.  pCur->curP
28a70 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  agerFlags = wrFl
28a80 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47  ag ? 0 : PAGER_G
28a90 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f  ET_READONLY;.  /
28aa0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74  * If there are t
28ab0 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f  wo or more curso
28ac0 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62  rs on the same b
28ad0 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73  tree, then all s
28ae0 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73  uch.  ** cursors
28af0 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65   *must* have the
28b00 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
28b10 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f  lag set. */.  fo
28b20 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f  r(pX=pBt->pCurso
28b30 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  r; pX; pX=pX->pN
28b40 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58  ext){.    if( pX
28b50 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e  ->pgnoRoot==(Pgn
28b60 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  o)iTable ){.    
28b70 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c    pX->curFlags |
28b80 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
28b90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
28ba0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
28bb0 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  ltiple;.    }.  
28bc0 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  }.  pCur->pNext 
28bd0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
28be0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
28bf0 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
28c00 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
28c10 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e  NVALID;.  return
28c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
28c30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
28c40 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
28c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
28c80 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
28c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
28cc0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
28cd0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
28d10 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
28d20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
28d30 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28d50 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
28d60 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
28d70 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
28da0 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
28db0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
28dc0 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31  ;.  if( iTable<1
28dd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
28de0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28df0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
28e00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
28e10 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  (p);.    rc = bt
28e20 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
28e30 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
28e40 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
28e50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
28e60 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
28e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28e80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
28e90 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
28ea0 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
28eb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
28ec0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
28ed0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
28ee0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
28ef0 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
28f00 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
28f10 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
28f20 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
28f30 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
28f40 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
28f50 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
28f60 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
28f70 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
28f80 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
28f90 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
28fa0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
28fb0 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
28fc0 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
28fd0 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
28fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
28ff0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
29000 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
29010 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
29020 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
29030 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
29040 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
29050 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
29060 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
29070 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
29080 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
29090 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
290a0 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
290b0 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
290c0 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
290d0 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
290e0 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
290f0 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
29100 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
29110 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
29120 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
29130 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
29140 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
29150 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
29160 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
29170 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
29180 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53 4f  tCursor, BTCURSO
29190 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29 29  R_FIRST_UNINIT))
291a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
291b0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
291c0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
291d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
291e0 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
291f0 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
29200 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
29210 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29220 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
29230 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
29240 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
29250 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
29260 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
29270 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
29280 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20  = pCur->pBt;.   
29290 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
292a0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
292b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
292c0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  rsor!=0 );.    i
292d0 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  f( pBt->pCursor=
292e0 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70  =pCur ){.      p
292f0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
29300 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
29310 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75  else{.      BtCu
29320 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42  rsor *pPrev = pB
29330 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  t->pCursor;.    
29340 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
29350 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ( pPrev->pNext==
29360 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pCur ){.        
29370 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d    pPrev->pNext =
29380 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
29390 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
293a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
293b0 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e   pPrev = pPrev->
293c0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68  pNext;.      }wh
293d0 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65  ile( ALWAYS(pPre
293e0 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v) );.    }.    
293f0 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
29400 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
29410 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
29420 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
29430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29440 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
29450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
29460 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
29470 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
29480 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
29490 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65      pCur->pBtree
294a0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
294b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
294c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
294d0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
294e0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
294f0 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
29500 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
29510 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
29520 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29530 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
29540 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
29550 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
29560 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
29570 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
29580 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
29590 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
295a0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
295b0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
295c0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
295d0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
295e0 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
295f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
29600 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c    static int cel
29610 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c 49  lInfoEqual(CellI
29620 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f  nfo *a, CellInfo
29630 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61 2d   *b){.    if( a-
29640 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20 29  >nKey!=b->nKey )
29650 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
29660 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21 3d  f( a->pPayload!=
29670 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72 65  b->pPayload ) re
29680 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
29690 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d 3e  a->nPayload!=b->
296a0 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72  nPayload ) retur
296b0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
296c0 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61  nLocal!=b->nLoca
296d0 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
296e0 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21 3d    if( a->nSize!=
296f0 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75 72  b->nSize ) retur
29700 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 0;.    return 
29710 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20  1;.  }.  static 
29720 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
29730 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
29740 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
29750 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  o info;.    mems
29760 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
29770 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
29780 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
29790 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
297a0 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  ->ix, &info);.  
297b0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
297c0 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f  T_DB || cellInfo
297d0 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70 43  Equal(&info, &pC
297e0 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20 7d  ur->info) );.  }
297f0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
29800 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
29810 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  x).#endif.static
29820 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
29830 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
29840 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
29850 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
29860 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
29870 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
29880 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
29890 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
298a0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70  arseCell(pCur->p
298b0 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70  Page,pCur->ix,&p
298c0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65  Cur->info);.  }e
298d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43  lse{.    assertC
298e0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
298f0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
29900 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
29910 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
29920 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
29930 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
29940 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
29950 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
29960 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
29970 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
29980 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
29990 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
299a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
299b0 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
299c0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
299d0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
299e0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
299f0 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
29a00 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
29a10 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
29a20 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
29a30 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
29a40 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
29a50 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
29a60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29a70 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
29a80 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71  NDEBUG */.int sq
29a90 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
29aa0 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73  IsValidNN(BtCurs
29ab0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
29ac0 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
29ad0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
29ae0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29af0 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
29b00 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
29b10 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
29b20 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72  y or "rowid" for
29b30 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a   a table btree..
29b40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29b50 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
29b60 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
29b70 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
29b80 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74   a.** ordinary t
29b90 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20  able btree.  If 
29ba0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
29bb0 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74  s to an index bt
29bc0 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76  ree or.** is inv
29bd0 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74  alid, the result
29be0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
29bf0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
29c00 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
29c10 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43  eeIntegerKey(BtC
29c20 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
29c30 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29c40 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29c60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29c70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
29c80 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
29c90 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  Key );.  getCell
29ca0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
29cb0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
29cc0 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nKey;.}..#ifdef 
29cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46  SQLITE_ENABLE_OF
29ce0 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a  FSET_SQL_FUNC./*
29cf0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
29d00 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64  ffset into the d
29d10 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
29d20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
29d30 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f 20  e.** payload to 
29d40 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
29d50 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f   is pointing..*/
29d60 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
29d70 65 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f 72  eOffset(BtCursor
29d80 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
29d90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29da0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
29db0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29dc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29dd0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
29de0 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
29df0 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70 42  rn (i64)pCur->pB
29e00 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69 36  t->pageSize*((i6
29e10 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70  4)pCur->pPage->p
29e20 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20 20  gno - 1) +.     
29e30 20 20 20 20 28 69 36 34 29 28 70 43 75 72 2d 3e      (i64)(pCur->
29e40 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20  info.pPayload - 
29e50 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
29e60 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ta);.}.#endif /*
29e70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
29e80 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 2a  FFSET_SQL_FUNC *
29e90 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
29ea0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
29eb0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66  tes of payload f
29ec0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
29ed0 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72  t pCur is.** cur
29ee0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
29ef0 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62  to.  For table b
29f00 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
29f10 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   be the amount.*
29f20 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20  * of data.  For 
29f30 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68  index btrees, th
29f40 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73  is will be the s
29f50 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a  ize of the key..
29f60 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
29f70 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
29f80 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
29f90 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
29fa0 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
29fb0 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
29fc0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
29fd0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
29fe0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
29ff0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
2a000 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
2a010 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a020 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  ID..*/.u32 sqlit
2a030 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
2a040 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
2a050 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
2a060 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2a070 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2a080 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a090 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a0a0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
2a0b0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
2a0c0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
2a0d0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
2a0e0 72 6e 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e  rn an upper boun
2a0f0 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
2a100 20 61 6e 79 20 72 65 63 6f 72 64 20 66 6f 72 20   any record for 
2a110 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61  the table.** tha
2a120 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
2a130 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 2e 0a 2a  pointing into..*
2a140 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
2a150 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 45  optimization.  E
2a160 76 65 72 79 74 68 69 6e 67 20 77 69 6c 6c 20 73  verything will s
2a170 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 74 68 69  till work if thi
2a180 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6c 77  s.** routine alw
2a190 61 79 73 20 72 65 74 75 72 6e 73 20 32 31 34 37  ays returns 2147
2a1a0 34 38 33 36 34 37 20 28 77 68 69 63 68 20 69 73  483647 (which is
2a1b0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 65 63   the largest rec
2a1c0 6f 72 64 0a 2a 2a 20 74 68 61 74 20 53 51 4c 69  ord.** that SQLi
2a1d0 74 65 20 63 61 6e 20 68 61 6e 64 6c 65 29 20 6f  te can handle) o
2a1e0 72 20 6d 6f 72 65 2e 20 20 42 75 74 20 72 65 74  r more.  But ret
2a1f0 75 72 6e 69 6e 67 20 61 20 73 6d 61 6c 6c 65 72  urning a smaller
2a200 20 76 61 6c 75 65 20 6d 69 67 68 74 0a 2a 2a 20   value might.** 
2a210 70 72 65 76 65 6e 74 20 6c 61 72 67 65 20 6d 65  prevent large me
2a220 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
2a230 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
2a240 69 6e 74 65 72 70 72 65 74 20 61 0a 2a 2a 20 63  interpret a.** c
2a250 6f 72 72 75 70 74 20 64 61 74 72 61 62 61 73 65  orrupt datrabase
2a260 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
2a270 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
2a280 6f 6e 20 6d 65 72 65 6c 79 20 72 65 74 75 72 6e  on merely return
2a290 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
2a2a0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
2a2b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2a2c0 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
2a2d0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 52  sqlite3BtreeMaxR
2a2e0 65 63 6f 72 64 53 69 7a 65 28 42 74 43 75 72 73  ecordSize(BtCurs
2a2f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
2a300 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2a310 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2a320 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a330 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a340 4c 49 44 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  LID );.  return 
2a350 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
2a360 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
2a370 6e 74 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e  nt64)pCur->pBt->
2a380 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
2a390 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
2a3a0 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
2a3b0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
2a3c0 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
2a3d0 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
2a3e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2a3f0 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
2a400 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
2a410 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
2a420 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
2a430 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
2a440 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
2a450 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
2a460 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
2a470 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
2a480 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
2a490 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
2a4a0 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
2a4b0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2a4c0 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
2a4d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2a4e0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
2a4f0 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
2a500 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2a510 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
2a520 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
2a530 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
2a540 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
2a550 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
2a560 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
2a570 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
2a580 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
2a590 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
2a5a0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
2a5b0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
2a5c0 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
2a5d0 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
2a5e0 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
2a5f0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
2a600 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
2a610 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
2a620 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
2a630 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2a640 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
2a650 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
2a660 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
2a670 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
2a680 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
2a690 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
2a6a0 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
2a6b0 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
2a6c0 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
2a6d0 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
2a6e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
2a6f0 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
2a700 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
2a710 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
2a720 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
2a730 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
2a740 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
2a750 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
2a760 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2a770 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2a780 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2a790 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a7b0 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
2a7c0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
2a7d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2a7e0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
2a7f0 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
2a800 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
2a810 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
2a820 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
2a830 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2a840 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
2a850 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
2a860 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
2a870 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a880 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
2a890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2a8a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a8b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2a8c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2a8d0 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
2a8e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a8f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2a900 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
2a910 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
2a920 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
2a930 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
2a940 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
2a950 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
2a960 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
2a970 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
2a980 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
2a990 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
2a9a0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
2a9b0 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
2a9c0 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
2a9d0 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
2a9e0 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
2a9f0 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
2aa00 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
2aa10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2aa20 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
2aa30 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
2aa40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2aa50 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
2aa60 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
2aa70 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
2aa80 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
2aa90 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
2aaa0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
2aab0 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
2aac0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2aad0 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
2aae0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
2aaf0 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
2ab00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
2ab10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2ab20 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
2ab30 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
2ab40 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2ab50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
2ab60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
2ab70 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
2ab80 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
2ab90 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
2aba0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2abb0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
2abc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2abd0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
2abe0 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
2abf0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
2ac00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ac10 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
2ac20 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
2ac30 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61  l, &pPage, (ppPa
2ac40 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47  ge==0) ? PAGER_G
2ac50 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
2ac60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
2ac70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
2ac80 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
2ac90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2aca0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
2acb0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
2acc0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
2acd0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
2ace0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
2acf0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
2ad00 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
2ad10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
2ad20 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2ad30 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
2ad40 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
2ad50 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
2ad60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
2ad70 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
2ad80 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
2ad90 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
2ada0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
2adb0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
2adc0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
2add0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
2ade0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
2adf0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
2ae00 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
2ae10 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
2ae20 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
2ae30 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
2ae40 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
2ae50 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
2ae60 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
2ae70 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
2ae80 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
2ae90 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
2aea0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
2aeb0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
2aec0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
2aed0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
2aee0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
2aef0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2af00 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
2af10 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
2af20 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
2af30 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
2af40 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
2af50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
2af60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2af70 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
2af80 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
2af90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2afa0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
2afb0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2afd0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2afe0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
2aff0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
2b000 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
2b010 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
2b020 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
2b030 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
2b040 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
2b050 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
2b060 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
2b070 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
2b080 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
2b090 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
2b0a0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
2b0b0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
2b0c0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2b0d0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
2b0e0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2b0f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b110 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
2b120 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
2b130 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
2b140 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
2b150 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
2b160 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
2b170 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
2b180 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
2b190 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
2b1a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2b1b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
2b1c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b1d0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
2b1e0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
2b1f0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
2b200 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
2b210 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
2b220 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
2b230 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61  to. The eOp.** a
2b240 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72  rgument is inter
2b250 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
2b260 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68  s:.**.**   0: Th
2b270 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
2b280 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20   read. Populate 
2b290 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
2b2a0 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20  he..**   1: The 
2b2b0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77  operation is a w
2b2c0 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74  rite. Populate t
2b2d0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
2b2e0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
2b2f0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
2b300 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
2b310 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
2b320 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
2b330 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
2b340 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
2b350 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
2b360 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
2b370 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
2b380 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
2b390 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
2b3a0 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
2b3b0 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
2b3c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
2b3d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2b3e0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
2b3f0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
2b400 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2b410 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  s.** this functi
2b420 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
2b430 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
2b440 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a  zily populate.**
2b450 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2b460 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
2b470 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
2b480 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
2b490 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
2b4a0 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
2b4b0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
2b4c0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
2b4d0 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
2b4e0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
2b4f0 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
2b500 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
2b510 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2b520 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a  ed, it must be.*
2b530 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
2b540 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
2b550 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
2b560 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
2b570 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
2b580 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
2b590 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
2b5a0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
2b5b0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
2b5c0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
2b5d0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
2b5e0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
2b5f0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2b600 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
2b610 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
2b620 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
2b630 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
2b640 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
2b650 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
2b660 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
2b670 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
2b680 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
2b690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2b6a0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
2b6b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2b6c0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
2b6d0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
2b6e0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
2b6f0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
2b700 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2b710 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
2b720 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
2b730 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
2b740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2b750 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
2b760 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2b770 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
2b780 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
2b790 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
2b7a0 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
2b7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
2b7c0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
2b7d0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
2b7e0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
2b7f0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
2b800 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b810 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
2b820 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2b830 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2b840 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2b850 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65     /* Btree page
2b860 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
2b870 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
2b880 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2b890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b8a0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
2b8b0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
2b8c0 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
2b8d0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
2b8e0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
2b8f0 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
2b900 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
2b910 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  f;     /* Start 
2b920 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20  of original out 
2b930 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66  buffer */.#endif
2b940 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2b950 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
2b960 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20  Op==0 || eOp==1 
2b970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b980 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b990 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2b9a0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50  ert( pCur->ix<pP
2b9b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2b9c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2b9d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2b9e0 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  ;..  getCellInfo
2b9f0 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
2ba00 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
2ba10 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65  pPayload;.  asse
2ba20 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
2ba30 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
2ba40 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65  yload );..  asse
2ba50 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70  rt( aPayload > p
2ba60 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
2ba70 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61 79   if( (uptr)(aPay
2ba80 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44  load - pPage->aD
2ba90 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61  ata) > (pBt->usa
2baa0 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e  bleSize - pCur->
2bab0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a  info.nLocal) ){.
2bac0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
2bad0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
2bae0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2baf0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
2bb00 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  ror.  The.    **
2bb10 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2bb20 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20  ve is really:.  
2bb30 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61    **    &aPayloa
2bb40 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
2bb50 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
2bb60 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
2bb70 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74  Size].    ** but
2bb80 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20   is recast into 
2bb90 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d  its current form
2bba0 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65   to avoid intege
2bbb0 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c  r overflow probl
2bbc0 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ems.    */.    r
2bbd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2bbe0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2bbf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
2bc00 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
2bc10 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
2bc20 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
2bc30 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
2bc40 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
2bc50 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
2bc60 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
2bc70 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
2bc80 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
2bc90 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2bca0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
2bcb0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
2bcc0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2bcd0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
2bce0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
2bcf0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
2bd00 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2bd10 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
2bd20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
2bd30 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
2bd40 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
2bd50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2bd60 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
2bd70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2bd80 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
2bd90 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
2bda0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2bdb0 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
2bdc0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
2bdd0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
2bde0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
2bdf0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
2be00 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
2be10 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
2be20 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
2be30 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
2be40 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
2be50 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
2be60 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
2be70 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
2be80 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
2be90 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
2bea0 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
2beb0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
2bec0 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
2bed0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
2bee0 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
2bef0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
2bf00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
2bf10 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
2bf20 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
2bf30 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
2bf40 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
2bf50 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
2bf60 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
2bf70 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
2bf80 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
2bf90 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
2bfa0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2bfb0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2bfc0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
2bfd0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
2bfe0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
2bff0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
2c000 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
2c010 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
2c020 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
2c030 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20  verflow==0.     
2c040 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29    || nOvfl*(int)
2c050 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73  sizeof(Pgno) > s
2c060 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
2c070 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
2c080 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
2c090 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
2c0a0 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
2c0b0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
2c0c0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
2c0d0 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
2c0e0 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
2c0f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c100 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
2c110 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c120 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2c130 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c140 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
2c150 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
2c160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c170 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
2c180 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
2c190 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
2c1a0 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43  Pgno));.      pC
2c1b0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2c1c0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
2c1d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c1e0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
2c1f0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2c200 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
2c210 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
2c220 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f       ** entry fo
2c230 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
2c240 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
2c250 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
2c260 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63  p.      ** direc
2c270 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20  tly to it..     
2c280 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2c290 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
2c2a0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
2c2b0 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78 20 3d  {.        iIdx =
2c2c0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
2c2d0 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  e);.        next
2c2e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
2c2f0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
2c300 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
2c310 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
2c320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c330 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
2c340 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
2c350 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  t>0 );.    while
2c360 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20  ( nextPage ){.  
2c370 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
2c380 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
2c390 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
2c3a0 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
2c3b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c3c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
2c3d0 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  ]==0.           
2c3e0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65     || pCur->aOve
2c3f0 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
2c400 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20  tPage.          
2c410 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
2c420 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  B );.      pCur-
2c430 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
2c440 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20   = nextPage;..  
2c450 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
2c460 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
2c470 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
2c480 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
2c490 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
2c4a0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
2c4b0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2c4c0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
2c4d0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
2c4e0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
2c4f0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
2c500 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
2c510 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
2c520 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
2c530 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
2c540 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
2c550 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
2c560 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
2c570 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
2c580 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
2c590 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
2c5a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2c5b0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  rt( pCur->curFla
2c5c0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2c5d0 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  vfl );.        a
2c5e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74  ssert( pCur->pBt
2c5f0 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62  ree->db==pBt->db
2c600 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c610 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2c620 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
2c630 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2c640 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2c650 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
2c660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c670 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
2c680 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
2c690 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
2c6a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2c6b0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
2c6c0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
2c6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c6e0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
2c6f0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
2c700 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
2c710 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
2c720 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
2c730 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
2c740 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
2c750 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
2c760 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
2c770 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
2c780 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
2c790 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
2c7a0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
2c7b0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
2c7c0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
2c7d0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
2c7e0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
2c7f0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
2c800 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
2c810 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2c820 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
2c830 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
2c840 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
2c850 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
2c860 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
2c870 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
2c880 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
2c890 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
2c8a0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
2c8b0 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 61   **   3) there a
2c8c0 72 65 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65  re no dirty page
2c8d0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
2c8e0 63 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  che.        **  
2c8f0 20 34 29 20 74 68 65 20 64 61 74 61 62 61 73 65   4) the database
2c900 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
2c910 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
2c920 20 20 35 29 20 74 68 65 20 70 61 67 65 20 69 73    5) the page is
2c930 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20   not in the WAL 
2c940 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
2c950 20 20 36 29 20 61 74 20 6c 65 61 73 74 20 34 20    6) at least 4 
2c960 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
2c970 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
2c980 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
2c990 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
2c9a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2c9b0 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
2c9c0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
2c9d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c9e0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2c9f0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
2ca00 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
2ca10 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
2ca20 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
2ca30 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
2ca40 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
2ca50 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
2ca60 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
2ca70 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
2ca80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  */.        if( e
2ca90 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  Op==0           
2caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cac0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
2cad0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
2cae0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
2cb10 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
2cb20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72   sqlite3PagerDir
2cb30 65 63 74 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70  ectReadOk(pBt->p
2cb40 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29  Pager, nextPage)
2cb50 20 20 20 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a      /* (3,4,5) *
2cb60 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
2cb70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
2cb80 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cba0 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
2cbb0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2cbc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2cbd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
2cbe0 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
2cbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  ;.          u8 a
2cc00 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
2cc10 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
2cc20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
2cc30 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
2cc40 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
2cc50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cc60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65            /* due
2cc70 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   to (6) */.     
2cc80 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
2cc90 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
2cca0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ccb0 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
2ccc0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
2ccd0 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
2cce0 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
2ccf0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
2cd00 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
2cd10 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
2cd20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
2cd30 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
2cd40 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2cd50 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2cd60 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
2cd70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
2cd80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2cd90 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
2cda0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
2cdb0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
2cdc0 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
2cdd0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
2cde0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
2cdf0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ce00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ce10 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
2ce20 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
2ce30 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
2ce40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2ce50 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
2ce60 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
2ce70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2ce80 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
2ce90 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
2cea0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
2ceb0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
2cec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2ced0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
2cee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
2cef0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
2cf00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2cf10 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
2cf20 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  a;.        if( a
2cf30 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  mt==0 ) return r
2cf40 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  c;.        pBuf 
2cf50 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
2cf60 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2cf70 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b  ak;.      iIdx++
2cf80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
2cf90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cfa0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
2cfb0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61   /* Overflow cha
2cfc0 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72  in ends prematur
2cfd0 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ely */.    retur
2cfe0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2cff0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
2d000 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d010 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
2d020 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
2d030 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
2d040 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
2d050 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
2d060 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
2d070 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
2d080 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
2d090 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
2d0a0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
2d0b0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
2d0c0 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
2d0d0 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
2d0e0 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
2d0f0 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
2d100 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
2d110 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
2d120 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
2d130 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
2d140 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
2d150 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
2d160 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
2d170 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
2d180 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
2d190 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
2d1a0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
2d1b0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
2d1c0 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
2d1d0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
2d1e0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
2d1f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2d200 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
2d210 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
2d220 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
2d230 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
2d240 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
2d250 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
2d260 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
2d270 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2d280 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2d290 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
2d2a0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
2d2b0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
2d2c0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
2d2d0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
2d2e0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
2d2f0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
2d300 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
2d310 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d320 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
2d330 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
2d340 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
2d350 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
2d360 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2d370 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2d380 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d390 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d3a0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2d3b0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2d3c0 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  && pCur->pPage )
2d3d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d3e0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2d3f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
2d400 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
2d410 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
2d420 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
2d430 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
2d440 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
2d450 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
2d460 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
2d470 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
2d480 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
2d490 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
2d4a0 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
2d4b0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
2d4c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
2d4d0 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
2d4e0 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
2d4f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2d500 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
2d510 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2d520 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
2d530 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
2d540 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
2d550 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
2d560 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
2d570 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2d580 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
2d590 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2d5a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d5b0 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
2d5c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2d5d0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2d5e0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
2d5f0 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
2d600 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2d610 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
2d620 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
2d630 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
2d640 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
2d650 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d660 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
2d670 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2d680 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
2d690 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
2d6a0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d6b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2d6c0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2d6d0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2d6e0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
2d6f0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
2d700 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2d710 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
2d720 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d730 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
2d740 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
2d750 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
2d760 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
2d770 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2d780 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
2d790 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2d7a0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
2d7b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
2d7c0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
2d7d0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
2d7e0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
2d7f0 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
2d800 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
2d810 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
2d820 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
2d830 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
2d840 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
2d850 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
2d860 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
2d870 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
2d880 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2d890 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
2d8a0 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
2d8b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
2d8c0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
2d8d0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
2d8e0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
2d8f0 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
2d900 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
2d910 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2d920 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
2d930 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
2d940 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
2d950 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
2d960 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
2d970 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
2d980 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
2d990 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
2d9a0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
2d9b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
2d9c0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
2d9d0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
2d9e0 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
2d9f0 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
2da00 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
2da10 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
2da20 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
2da30 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
2da40 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
2da50 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
2da60 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
2da70 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
2da80 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
2da90 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
2daa0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
2dab0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
2dac0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
2dad0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
2dae0 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
2daf0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2db00 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
2db10 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
2db20 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
2db30 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
2db40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
2db50 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
2db60 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
2db70 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
2db80 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
2db90 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
2dba0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
2dbb0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
2dbc0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
2dbd0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
2dbe0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
2dbf0 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
2dc00 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65   int amt;.  asse
2dc10 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
2dc20 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
2dc30 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
2dc40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2dc50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2dc60 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2dc70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2dc80 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
2dc90 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
2dca0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2dcb0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2dcc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2dcd0 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
2dce0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2dcf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2dd00 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
2dd10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2dd20 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
2dd30 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20  r->pPage->aData 
2dd40 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
2dd50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2dd60 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
2dd70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2dd80 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
2dd90 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72  B);.  amt = pCur
2dda0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
2ddb0 20 69 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70   if( amt>(int)(p
2ddc0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2ddd0 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
2dde0 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20  o.pPayload) ){. 
2ddf0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74     /* There is t
2de00 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20  oo little space 
2de10 6f 6e 20 74 68 65 20 70 61 67 65 20 66 6f 72 20  on the page for 
2de20 74 68 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f  the expected amo
2de30 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f  unt.    ** of lo
2de40 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74  cal content. Dat
2de50 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2de60 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73  rrupt. */.    as
2de70 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
2de80 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41   );.    amt = MA
2de90 58 28 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d  X(0, (int)(pCur-
2dea0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2deb0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
2dec0 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20  ayload));.  }.  
2ded0 2a 70 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74  *pAmt = (u32)amt
2dee0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
2def0 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
2df00 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
2df10 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
2df20 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
2df30 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
2df40 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
2df50 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
2df60 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
2df70 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
2df80 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
2df90 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
2dfa0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
2dfb0 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
2dfc0 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
2dfd0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
2dfe0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
2dff0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
2e000 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
2e010 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
2e020 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
2e030 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
2e040 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
2e050 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
2e060 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
2e070 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
2e080 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
2e090 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
2e0a0 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
2e0b0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
2e0c0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2e0d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
2e0e0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
2e0f0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
2e100 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
2e110 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
2e120 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
2e130 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2e140 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
2e150 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
2e160 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74  3BtreePayloadFet
2e170 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
2e180 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
2e190 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
2e1a0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
2e1b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
2e1c0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2e1d0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
2e1e0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
2e1f0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
2e200 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
2e210 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
2e220 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
2e230 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2e240 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2e250 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
2e260 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
2e270 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
2e280 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
2e290 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
2e2a0 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
2e2b0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
2e2c0 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
2e2d0 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
2e2e0 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
2e2f0 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
2e300 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
2e310 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
2e320 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2e330 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
2e340 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
2e350 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  no){.  BtShared 
2e360 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
2e370 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
2e380 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2e390 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2e3a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e3b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2e3c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2e3d0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2e3e0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
2e3f0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
2e400 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2e410 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
2e420 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
2e430 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
2e440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e450 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2e460 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
2e470 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2e480 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2e490 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2e4a0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2e4b0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
2e4c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
2e4d0 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d  Cur->ix;.  pCur-
2e4e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e4f0 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61  age] = pCur->pPa
2e500 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  ge;.  pCur->ix =
2e510 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
2e520 65 2b 2b 3b 0a 20 20 72 63 20 3d 20 67 65 74 41  e++;.  rc = getA
2e530 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2e540 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
2e550 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  pPage,.         
2e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e570 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
2e580 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  gerFlags);.  if(
2e590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e5a0 7b 0a 20 20 20 20 73 65 74 4d 65 6d 70 61 67 65  {.    setMempage
2e5b0 52 6f 6f 74 28 70 43 75 72 2d 3e 70 50 61 67 65  Root(pCur->pPage
2e5c0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2e5d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2e5e0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
2e5f0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2e600 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
2e610 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
2e620 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
2e630 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2e640 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
2e650 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
2e660 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
2e670 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
2e680 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
2e690 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
2e6a0 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
2e6b0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
2e6c0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
2e6d0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
2e6e0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
2e6f0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
2e700 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
2e710 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2e720 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
2e730 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
2e740 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
2e750 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
2e760 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52  ild){.  if( CORR
2e770 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
2e780 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69    /* The conditi
2e790 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77  ons tested below
2e7a0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72   might not be tr
2e7b0 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2e7d0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  * in a corrupt d
2e7e0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73  atabase */.  ass
2e7f0 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
2e800 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
2e810 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
2e820 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
2e830 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2e840 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2e850 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2e860 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
2e870 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2e880 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2e890 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
2e8a0 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
2e8b0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2e8c0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
2e8d0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
2e8e0 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
2e8f0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2e900 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
2e910 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
2e920 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
2e930 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
2e940 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
2e950 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
2e960 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
2e970 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
2e980 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
2e990 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
2e9a0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
2e9b0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
2e9c0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
2e9d0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
2e9e0 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
2e9f0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
2ea00 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
2ea10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ea20 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65  {.  MemPage *pLe
2ea30 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  af;.  assert( cu
2ea40 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ea50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ea60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ea70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2ea80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ea90 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
2eaa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2eab0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  ge );.  assertPa
2eac0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
2ead0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2eae0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2eaf0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2eb00 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
2eb10 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70    pCur->pPage->p
2eb20 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
2eb30 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
2eb40 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
2eb50 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
2eb60 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
2eb70 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
2eb80 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2eb90 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2eba0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2ebb0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2ebc0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78  vfl);.  pCur->ix
2ebd0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2ebe0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
2ebf0 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70   pLeaf = pCur->p
2ec00 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50  Page;.  pCur->pP
2ec10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2ec20 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65  ge[--pCur->iPage
2ec30 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ];.  releasePage
2ec40 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a  NotNull(pLeaf);.
2ec50 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2ec60 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
2ec70 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
2ec80 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
2ec90 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2eca0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
2ecb0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
2ecc0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
2ecd0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
2ece0 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
2ecf0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2ed00 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
2ed10 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2ed20 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
2ed30 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
2ed40 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
2ed50 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
2ed60 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
2ed70 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
2ed80 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
2ed90 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2eda0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
2edb0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
2edc0 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
2edd0 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
2ede0 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
2edf0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
2ee00 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
2ee10 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61  CURSOR_INVALID a
2ee20 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
2ee30 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
2ee40 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c  MPTY. Otherwise,
2ee50 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
2ee60 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
2ee70 6f 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  o the first cell
2ee80 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
2ee90 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74  root.** (or virt
2eea0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
2eeb0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
2eec0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
2eed0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
2eee0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
2eef0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
2ef00 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
2ef10 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
2ef20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
2ef30 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
2ef40 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
2ef50 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
2ef60 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
2ef70 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
2ef80 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
2ef90 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
2efa0 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
2efb0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
2efc0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2efd0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
2efe0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
2eff0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
2f000 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
2f010 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
2f020 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
2f030 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
2f040 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
2f050 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2f060 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2f070 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
2f080 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
2f090 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
2f0a0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2f0b0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
2f0c0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2f0d0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
2f0e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2f0f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2f100 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2f110 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2f120 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
2f130 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2f140 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2f150 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
2f160 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f170 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2f180 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
2f190 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2f1a0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2f1b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20   pCur->eState < 
2f1c0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f1d0 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  EK || pCur->iPag
2f1e0 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e<0 );.  assert(
2f1f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e   pCur->pgnoRoot>
2f200 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
2f210 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  <0 );..  if( pCu
2f220 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
2f230 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2f240 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  ge ){.      rele
2f250 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2f260 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
2f270 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72     while( --pCur
2f280 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2f290 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2f2a0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
2f2b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
2f2c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f2d0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
2f2e0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
2f2f0 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69       goto skip_i
2f300 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  nit;.    }.  }el
2f310 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
2f320 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
2f330 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f340 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2f350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f360 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b  _EMPTY;.  }else{
2f370 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2f380 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
2f390 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
2f3a0 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2f3b0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
2f3c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2f3d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2f3e0 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LT ){.        as
2f3f0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2f400 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
2f410 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2f420 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
2f430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f440 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2f450 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2f460 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
2f470 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
2f480 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
2f490 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2f4a0 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20  &pCur->pPage,.  
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4c0 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63        0, pCur->c
2f4d0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20  urPagerFlags);. 
2f4e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
2f500 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2f510 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2f520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f530 20 20 7d 0a 20 20 20 20 73 65 74 4d 65 6d 70 61    }.    setMempa
2f540 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70 50 61  geRoot(pCur->pPa
2f550 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ge, pCur->pgnoRo
2f560 6f 74 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  ot);.    pCur->i
2f570 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
2f580 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
2f590 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
2f5a0 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
2f5b0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2f5c0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2f5d0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
2f5e0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
2f5f0 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
2f600 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2f610 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
2f620 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
2f630 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
2f640 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
2f650 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
2f660 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2f670 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
2f680 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
2f690 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
2f6a0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
2f6b0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
2f6c0 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
2f6d0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
2f6e0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
2f6f0 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
2f700 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
2f710 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
2f720 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
2f730 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
2f740 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
2f750 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
2f760 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2f770 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
2f780 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
2f790 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
2f7a0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
2f7b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2f7c0 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
2f7d0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
2f7e0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
2f7f0 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
2f800 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
2f810 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
2f820 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
2f830 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2f840 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
2f850 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
2f860 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
2f870 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
2f880 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2f890 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
2f8a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f8b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
2f8c0 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  E(pCur->pPage);.
2f8d0 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20    }..skip_init: 
2f8e0 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30   .  pCur->ix = 0
2f8f0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2f900 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2f910 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2f920 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2f930 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2f940 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70  ValidOvfl);..  p
2f950 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2f960 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  ge;.  if( pRoot-
2f970 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2f980 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f990 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2f9a0 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2f9b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2f9c0 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2f9d0 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2f9e0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2f9f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2fa00 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2fa10 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2fa20 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2fa30 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2fa40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2fa50 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2fa60 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2fa70 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2fa80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2fa90 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2faa0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2fab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
2fac0 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  TY;.  }.  return
2fad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2fae0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2faf0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
2fb00 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2fb10 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
2fb20 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
2fb30 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2fb40 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
2fb50 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2fb60 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2fb70 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
2fb80 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
2fb90 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2fba0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2fbb0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
2fbc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2fbd0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2fbe0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2fbf0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2fc00 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2fc10 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2fc20 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2fc30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2fc40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2fc50 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
2fc60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2fc70 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2fc80 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2fc90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2fca0 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
2fcb0 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
2fcc0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2fcd0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2fce0 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  x));.    rc = mo
2fcf0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2fd00 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2fd10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fd20 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2fd30 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
2fd40 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
2fd50 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2fd60 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
2fd70 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2fd80 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
2fd90 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
2fda0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
2fdb0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
2fdc0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2fdd0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
2fde0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2fdf0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
2fe00 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2fe10 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
2fe20 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2fe30 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
2fe40 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
2fe50 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
2fe60 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
2fe70 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
2fe80 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2fe90 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
2fea0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
2feb0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2fec0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2fed0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
2fee0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2fef0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2ff00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ff10 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2ff20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
2ff30 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ff40 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ff50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ff60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ff70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2ff80 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
2ff90 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2ffa0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
2ffb0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2ffc0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2ffd0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2ffe0 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65  pCur->ix = pPage
2fff0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
30000 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
30010 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
30020 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30030 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  c;.  }.  pCur->i
30040 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
30050 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
30060 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
30070 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
30080 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30090 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
300a0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
300b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
300c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
300d0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
300e0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
300f0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
30100 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
30110 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
30120 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
30130 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
30140 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
30150 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
30160 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
30170 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
30180 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
30190 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
301a0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
301b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
301c0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
301d0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
301e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
301f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
30200 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
30210 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
30220 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
30230 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
30240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
30250 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
30260 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
30270 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
30280 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
30290 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
302a0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
302b0 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61  E_EMPTY ){.    a
302c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
302d0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
302e0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
302f0 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
30300 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
30310 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
30320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
30330 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
30340 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
30350 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
30360 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
30370 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
30380 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
30390 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
303a0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
303b0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
303c0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
303d0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
303e0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
303f0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
30400 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30410 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
30420 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
30430 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
30440 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
30450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
30460 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
30470 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
30480 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
30490 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
304a0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
304b0 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
304c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
304d0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
304e0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
304f0 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
30500 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
30510 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
30520 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
30530 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
30540 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
30550 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
30560 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
30570 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
30580 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
30590 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
305a0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
305b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
305c0 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
305d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
305e0 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
305f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
30600 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
30610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
30620 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61  r->ix==pCur->pPa
30630 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  ge->nCell-1 );. 
30640 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
30650 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  >pPage->leaf );.
30660 23 65 6e 64 69 66 0a 20 20 20 20 2a 70 52 65 73  #endif.    *pRes
30670 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
30680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
30690 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
306a0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
306b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
306c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
306d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
306e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a  R_VALID );.    *
306f0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  pRes = 0;.    rc
30700 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
30710 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  st(pCur);.    if
30720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30730 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  ){.      pCur->c
30740 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
30750 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73  AtLast;.    }els
30760 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e{.      pCur->c
30770 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
30780 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20  _AtLast;.    }. 
30790 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
307a0 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
307b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
307c0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
307d0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
307e0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
307f0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
30800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
30810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30820 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
30830 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
30840 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
30850 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
30860 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
30870 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
30880 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
30890 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
308a0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
308b0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
308c0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
308d0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
308e0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
308f0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
30900 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
30910 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
30920 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
30930 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
30940 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
30950 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
30960 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
30970 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
30980 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
30990 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
309a0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
309b0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
309c0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
309d0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
309e0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
309f0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
30a00 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
30a10 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
30a20 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
30a30 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
30a40 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
30a50 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
30a60 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
30a70 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
30a80 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
30a90 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
30aa0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
30ab0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
30ac0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
30ad0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
30ae0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
30af0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
30b00 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
30b10 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
30b20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
30b30 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
30b40 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
30b50 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
30b60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
30b70 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
30b80 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
30b90 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
30ba0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
30bb0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
30bc0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
30bd0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
30be0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
30bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
30c00 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
30c10 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
30c20 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
30c30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
30c40 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
30c50 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
30c60 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
30c70 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
30c80 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
30c90 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
30ca0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
30cb0 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
30cc0 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
30cd0 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
30ce0 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
30cf0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
30d00 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
30d10 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
30d20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
30d30 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
30d40 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
30d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30d60 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
30d70 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
30d80 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
30d90 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
30da0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
30db0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
30dc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
30dd0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
30de0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
30df0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
30e00 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
30e10 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
30e20 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30e40 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
30e50 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
30e60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
30e70 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
30e80 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
30e90 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
30ea0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
30eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30ec0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30ed0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
30ee0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
30ef0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
30f00 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
30f10 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
30f20 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
30f30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
30f40 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
30f50 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
30f60 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
30f70 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
30f80 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
30f90 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
30fa0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
30fb0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
30fc0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
30fd0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
30fe0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
30ff0 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
31000 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
31010 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
31020 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
31030 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
31040 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
31050 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
31060 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
31070 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
31080 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
31090 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
310a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
310b0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
310c0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
310d0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
310e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
310f0 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
31100 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
31110 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
31120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31130 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
31140 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
31150 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
31160 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
31170 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
31180 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
31190 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
311a0 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
311b0 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
311c0 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
311d0 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
311e0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
311f0 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
31200 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
31210 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
31220 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
31230 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20  is case, only a 
31240 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77  little more slow
31250 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ely */.      if(
31260 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
31270 2b 31 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  +1==intKey ){.  
31280 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
31290 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
312a0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
312b0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
312c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
312d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
312e0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
312f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31300 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
31310 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
31320 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
31350 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
31360 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
31370 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31380 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
31390 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
313a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
313b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
313c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
313d0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
313e0 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
313f0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
31400 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
31410 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
31420 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
31430 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
31440 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
31450 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
31460 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
31470 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
31480 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
31490 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
314a0 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
314b0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
314c0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
314d0 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
314e0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
314f0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
31500 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
31510 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
31520 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
31530 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
31540 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
31550 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
31560 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
31570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31580 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
31590 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
315a0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
315b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
315c0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
315d0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
315e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
315f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
31600 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
31610 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29  age->nCell > 0 )
31620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
31630 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43  ->iPage==0 || pC
31640 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
31650 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
31660 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
31670 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
31680 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
31690 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
316a0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
316b0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
316c0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
316d0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
316e0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38  r->pPage;.    u8
316f0 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31710 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
31720 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
31730 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
31740 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
31750 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
31760 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
31770 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
31780 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
31790 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
317a0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
317b0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
317c0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
317d0 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
317e0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
317f0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
31800 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
31810 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
31820 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
31830 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
31840 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
31850 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
31860 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
31870 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
31880 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
31890 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
318a0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
318b0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
318c0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
318d0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
318e0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
318f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31900 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
31910 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31920 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
31930 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
31940 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
31950 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
31960 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
31970 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
31980 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
31990 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
319a0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
319b0 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
319c0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
319d0 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
319e0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
319f0 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
31a00 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
31a10 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
31a20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
31a30 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
31a40 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
31a50 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
31a60 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
31a70 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
31a80 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
31a90 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
31aa0 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
31ab0 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
31ac0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a  ge->aDataEnd ){.
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
31ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
31af0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
31b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31b10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
31b30 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
31b40 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
31b50 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
31b60 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
31b70 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
31b80 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
31b90 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
31ba0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
31bb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
31bc0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
31bd0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
31be0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
31bf0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
31c00 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
31c10 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
31c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
31c30 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
31c40 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
31c50 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
31c60 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
31c70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31c80 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
31c90 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
31ca0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
31cb0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
31cc0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
31cd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
31ce0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
31cf0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
31d00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
31d10 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
31d20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
31d30 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
31d40 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
31d50 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
31d60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
31d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31d80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
31da0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
31db0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
31dc0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
31dd0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
31de0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
31df0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
31e00 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
31e10 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
31e20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
31e30 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
31e40 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
31e50 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
31e60 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
31e70 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
31e80 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
31e90 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
31ea0 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
31eb0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
31ec0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
31ed0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
31ee0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
31ef0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
31f00 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
31f10 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
31f20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
31f30 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
31f40 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
31f50 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
31f60 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
31f70 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
31f80 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
31f90 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
31fa0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
31fb0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
31fc0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
31fd0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
31fe0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
31ff0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
32000 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
32010 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
32020 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
32030 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
32040 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
32050 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32060 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
32070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
32080 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
32090 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
320a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
320b0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
320c0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
320d0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
320e0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
320f0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
32100 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
32110 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
32120 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
32130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
32140 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
32150 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32160 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
32170 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
32180 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
32190 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
321a0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
321b0 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
321c0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
321d0 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
321e0 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
321f0 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
32200 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
32210 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
32220 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
32230 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
32240 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
32250 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
32260 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
32270 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
32280 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
32290 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
322a0 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
322b0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
322c0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
322d0 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
322e0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
322f0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
32300 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
32310 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
32320 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
32330 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
32350 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
32360 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
32370 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
32380 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
32390 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
323a0 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
323b0 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
323c0 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
323d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
323e0 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
323f0 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
32400 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
32410 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
32420 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
32430 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
32440 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
32450 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
32460 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
32470 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
32480 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
32490 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
324a0 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
324b0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
324c0 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
324d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
324e0 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
324f0 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
32500 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
32510 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
32520 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
32530 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
32540 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
32550 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
32560 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
32570 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
32580 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
32590 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
325a0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
325b0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
325c0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4f 76     const int nOv
325d0 65 72 72 75 6e 20 3d 20 31 38 3b 20 20 2f 2a 20  errun = 18;  /* 
325e0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 76 65 72  Size of the over
325f0 72 75 6e 20 70 61 64 64 69 6e 67 20 2a 2f 0a 20  run padding */. 
32600 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
32610 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
32620 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
32630 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
32640 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
32650 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
32660 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
32670 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
32680 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
32690 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
326a0 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
326b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
326c0 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
326d0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
326e0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
326f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
32700 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
32710 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
32720 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
32730 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
32740 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32750 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
32760 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
32770 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
32780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
32790 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f  Cell<2 || nCell/
327a0 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  pCur->pBt->usabl
327b0 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d  eSize>pCur->pBt-
327c0 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
327d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
327e0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
327f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32800 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
32810 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
32820 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
32830 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
32840 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 6e 4f 76  alloc( nCell+nOv
32850 65 72 72 75 6e 20 29 3b 0a 20 20 20 20 20 20 20  errun );.       
32860 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
32870 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
32880 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
32890 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
328a0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
328b0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
328c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
328d0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
328e0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
328f0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
32900 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
32910 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
32920 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
32930 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
32940 28 28 28 75 38 2a 29 70 43 65 6c 6c 4b 65 79 29  (((u8*)pCellKey)
32950 2b 6e 43 65 6c 6c 2c 30 2c 6e 4f 76 65 72 72 75  +nCell,0,nOverru
32960 6e 29 3b 20 2f 2a 20 46 69 78 20 75 6e 69 6e 69  n); /* Fix unini
32970 74 20 77 61 72 6e 69 6e 67 73 20 2a 2f 0a 20 20  t warnings */.  
32980 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
32990 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
329a0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
329b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
329c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
329d0 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
329e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
329f0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
32a00 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
32a10 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
32a20 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
32a30 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
32a40 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
32a50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
32a60 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
32a70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32a80 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20       assert( .  
32a90 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b            (pIdxK
32aa0 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
32ab0 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63  ITE_CORRUPT || c
32ac0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26  ==0).         &&
32ad0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
32ae0 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  de!=SQLITE_NOMEM
32af0 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65   || pCur->pBtree
32b00 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
32b10 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ed).        );. 
32b20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29         if( c<0 )
32b30 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
32b40 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
32b50 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29   }else if( c>0 )
32b60 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
32b70 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
32b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32b90 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29    assert( c==0 )
32ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  ;.          *pRe
32bb0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
32bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32bd0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
32be0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
32bf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
32c00 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29  dxKey->errCode )
32c10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32c20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
32c30 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
32c40 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
32c50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
32c60 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
32c70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32c80 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
32c90 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
32ca0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
32cb0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
32cc0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
32cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
32ce0 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
32cf0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
32d00 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
32d10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
32d20 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
32d30 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
32d40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32d50 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
32d60 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
32d70 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
32d80 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
32d90 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
32da0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32db0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
32dc0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
32dd0 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
32de0 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
32df0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
32e00 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
32e10 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
32e20 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
32e30 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
32e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
32e50 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
32e60 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
32e70 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
32e80 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
32e90 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
32ea0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
32eb0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
32ec0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
32ed0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
32ee0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
32ef0 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
32f00 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
32f10 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
32f20 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  vfl)==0 );.  ret
32f30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
32f40 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
32f50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
32f60 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
32f70 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
32f80 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
32f90 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
32fa0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
32fb0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
32fc0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
32fd0 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
32fe0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
32ff0 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
33000 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
33010 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
33020 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
33030 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
33040 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
33050 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33060 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
33070 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
33080 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
33090 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
330a0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
330b0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
330c0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
330d0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
330e0 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
330f0 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
33100 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
33110 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
33120 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
33130 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
33140 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
33150 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
33160 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
33170 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74  ** Return an est
33180 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75  imate for the nu
33190 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
331a0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70  the table that p
331b0 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69  Cur is.** pointi
331c0 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61  ng to.  Return a
331d0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
331e0 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20   if no estimate 
331f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a  is currently .**
33200 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69   available..*/.i
33210 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  64 sqlite3BtreeR
33220 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72  owCountEst(BtCur
33230 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36  sor *pCur){.  i6
33240 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20  4 n;.  u8 i;..  
33250 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
33260 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
33270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
33280 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33290 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
332a0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
332b0 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69  /* Currently thi
332c0 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f  s interface is o
332d0 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68  nly called by th
332e0 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20  e OP_IfSmaller. 
332f0 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20   ** opcode, and 
33300 69 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65  it that case the
33310 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77   cursor will alw
33320 61 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64  ays be valid and
33330 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79  .  ** will alway
33340 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61  s point to a lea
33350 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28  f node. */.  if(
33360 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74   NEVER(pCur->eSt
33370 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
33380 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  D) ) return -1;.
33390 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
333a0 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ->pPage->leaf==0
333b0 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a  ) ) return -1;..
333c0 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61 67    n = pCur->pPag
333d0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28  e->nCell;.  for(
333e0 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61  i=0; i<pCur->iPa
333f0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20  ge; i++){.    n 
33400 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  *= pCur->apPage[
33410 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20  i]->nCell;.  }. 
33420 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
33430 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
33440 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
33450 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
33460 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65  database. .** Re
33470 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a  turn value:.**.*
33480 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20  *    SQLITE_OK  
33490 20 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a        success.**
334a0 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20      SQLITE_DONE 
334b0 20 20 20 20 20 63 75 72 73 6f 72 20 69 73 20 61       cursor is a
334c0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
334d0 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  at the last elem
334e0 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77  ent.**    otherw
334f0 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65 20  ise        some 
33500 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63  kind of error oc
33510 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65  curred.**.** The
33520 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
33530 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
33540 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
33550 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
33560 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
33570 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
33580 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
33590 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
335a0 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
335b0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
335c0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
335d0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
335e0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
335f0 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
33600 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
33610 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
33620 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
33630 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
33640 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
33650 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
33660 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31  *.** If bit 0x01
33670 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65   of the F argume
33680 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  nt in sqlite3Btr
33690 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20 31  eeNext(C,F) is 1
336a0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75  , then the.** cu
336b0 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  rsor corresponds
336c0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
336d0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
336e0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
336f0 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20  n.** skipped if 
33700 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61  the SQL index ha
33710 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20  d been a unique 
33720 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72  index.  The F ar
33730 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68  gument.** is a h
33740 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
33750 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62 74  ment.  SQLite bt
33760 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
33770 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  on does not use.
33780 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75  ** this hint, bu
33790 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a  t COMDB2 does..*
337a0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
337b0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
337c0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
337d0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
337e0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
337f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
33800 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
33810 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
33820 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
33830 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
33840 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
33850 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
33860 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
33870 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
33880 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
33890 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
338a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
338b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
338c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
338d0 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
338e0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
338f0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
33900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33910 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
33920 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
33930 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
33940 54 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  T ){.      pCur-
33950 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
33960 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
33970 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
33980 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
33990 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
339a0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
339b0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d  ->pPage;.  idx =
339c0 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69   ++pCur->ix;.  i
339d0 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
339e0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  t ){.    /* The 
339f0 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66  only known way f
33a00 6f 72 20 74 68 69 73 20 74 6f 20 68 61 70 70 65  or this to happe
33a10 6e 20 69 73 20 66 6f 72 20 74 68 65 72 65 20 74  n is for there t
33a20 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72 65  o be a.    ** re
33a30 63 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e 63  cursive SQL func
33a40 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61  tion that does a
33a50 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
33a60 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a 20  n as part of a. 
33a70 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68 69     ** SELECT whi
33a80 63 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74 65  ch deletes conte
33a90 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  nt out from unde
33aa0 72 20 61 6e 20 61 63 74 69 76 65 20 63 75 72 73  r an active curs
33ab0 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 63  or.    ** in a c
33ac0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
33ad0 66 69 6c 65 20 77 68 65 72 65 20 74 68 65 20 74  file where the t
33ae0 61 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45 54  able being DELET
33af0 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  E-ed from.    **
33b00 20 68 61 73 20 70 61 67 65 73 20 69 6e 20 63 6f   has pages in co
33b10 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74 61  mmon with the ta
33b20 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
33b30 64 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20 20  d.  See TH3.    
33b40 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62  ** module cov1/b
33b50 74 72 65 65 37 38 2e 74 65 73 74 20 74 65 73 74  tree78.test test
33b60 63 61 73 65 20 32 32 30 20 28 32 30 31 38 2d 30  case 220 (2018-0
33b70 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20 20  6-08) for an.   
33b80 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a   ** example. */.
33b90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33ba0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33bb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33bc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
33bd0 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
33be0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
33bf0 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
33c00 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
33c10 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
33c20 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
33c30 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
33c40 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
33c50 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
33c60 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
33c70 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
33c80 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
33c90 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
33ca0 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
33cb0 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
33cc0 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
33cd0 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
33ce0 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
33cf0 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
33d00 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
33d10 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
33d20 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
33d30 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
33d40 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
33d50 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
33d60 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
33d70 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
33d80 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
33d90 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
33da0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
33db0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33dc0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
33dd0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
33de0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
33df0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
33e00 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
33e10 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
33e20 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
33e30 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
33e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
33e50 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
33e60 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
33e70 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
33e80 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
33e90 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
33ea0 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e  ur->ix>=pPage->n
33eb0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
33ec0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
33ed0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
33ee0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
33ef0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
33f00 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
33f10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
33f20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
33f30 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
33f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33f50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
33f60 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
33f70 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
33f80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33f90 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
33fa0 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  pCur, int flags)
33fb0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
33fc0 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ge;.  UNUSED_PAR
33fd0 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b  AMETER( flags );
33fe0 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d    /* Used in COM
33ff0 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69  DB2 but not nati
34000 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61  ve SQLite */.  a
34010 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
34020 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
34030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
34040 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
34050 31 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  1 );.  pCur->inf
34060 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
34070 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
34080 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
34090 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
340a0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
340b0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
340c0 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
340d0 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
340e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
340f0 61 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  age;.  if( (++pC
34100 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e  ur->ix)>=pPage->
34110 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
34120 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74  r->ix--;.    ret
34130 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
34140 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ur);.  }.  if( p
34150 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
34160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34170 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
34180 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
34190 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
341a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
341b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
341c0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
341d0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
341e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
341f0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a   Return values:.
34200 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
34210 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a  _OK     success.
34220 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f  **     SQLITE_DO
34230 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20  NE   the cursor 
34240 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68  is already on th
34250 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
34260 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
34270 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
34280 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
34290 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
342a0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
342b0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
342c0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
342d0 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
342e0 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
342f0 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
34300 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
34310 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  decrementing the
34320 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
34330 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
34340 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
34350 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
34360 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
34370 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65  slower) btreePre
34380 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65  vious().** helpe
34390 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  r routine is cal
343a0 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
343b0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
343c0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
343d0 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65  page.** or to re
343e0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
343f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30  ..**.** If bit 0
34400 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67  x01 of the F arg
34410 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
34420 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c  BtreePrevious(C,
34430 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a  F) is 1, then.**
34440 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72   the cursor corr
34450 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
34460 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
34470 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
34480 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
34490 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
344a0 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
344b0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
344c0 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73  he F argument is
344d0 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68   a.** hint to th
344e0 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68  e implement.  Th
344f0 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  e native SQLite 
34500 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
34510 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  tion does not.**
34520 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20   use this hint, 
34530 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e  but COMDB2 does.
34540 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
34550 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
34560 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
34570 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
34580 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
34590 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
345a0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
345b0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
345c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
345d0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
345e0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
345f0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
34600 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
34610 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
34620 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
34630 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
34640 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
34650 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
34660 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
34670 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
34680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34690 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
346a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
346b0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
346c0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
346d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
346e0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
346f0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
34700 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
34710 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
34720 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
34730 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
34740 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
34750 6b 69 70 4e 65 78 74 3c 30 20 29 20 72 65 74 75  kipNext<0 ) retu
34760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
34770 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
34780 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
34790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
347a0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
347b0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
347c0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
347d0 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20  Cur->ix;.    rc 
347e0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
347f0 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
34800 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
34810 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
34820 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34830 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
34840 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
34850 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
34860 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a   pCur->ix==0 ){.
34870 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
34880 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
34890 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
348a0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
348b0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
348c0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
348d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
348e0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
348f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
34900 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
34910 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
34920 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
34930 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
34940 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
34950 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b  .    pCur->ix--;
34960 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
34970 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66  r->pPage;.    if
34980 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
34990 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
349a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
349b0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
349c0 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  us(pCur, 0);.   
349d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
349e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
349f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
34a00 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
34a10 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
34a20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
34a30 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
34a40 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
34a50 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
34a60 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
34a70 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
34a80 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
34a90 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b  AMETER( flags );
34aa0 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d    /* Used in COM
34ab0 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69  DB2 but not nati
34ac0 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70  ve SQLite */.  p
34ad0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
34ae0 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
34af0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
34b00 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
34b10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
34b20 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
34b30 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
34b40 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
34b50 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20  ur->ix==0.   || 
34b60 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
34b70 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  f==0.  ){.    re
34b80 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f  turn btreePrevio
34b90 75 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  us(pCur);.  }.  
34ba0 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65  pCur->ix--;.  re
34bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
34bd0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
34be0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
34bf0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
34c00 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
34c10 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
34c20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
34c30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34c40 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
34c50 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
34c60 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
34c70 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
34c80 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
34c90 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
34ca0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
34cb0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
34cc0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
34cd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34ce0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
34cf0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
34d00 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
34d10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
34d20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
34d30 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
34d40 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
34d50 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
34d60 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
34d70 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  LL in the event 
34d80 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  of an error..**.
34d90 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
34da0 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
34db0 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65  not 0, then an e
34dc0 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
34dd0 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
34de0 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
34df0 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
34e00 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
34e10 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
34e20 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
34e30 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
34e40 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
34e50 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
34e60 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
34e70 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
34e80 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
34e90 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
34ea0 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61   If the eMode pa
34eb0 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c  rameter is BTALL
34ec0 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65  OC_EXACT and the
34ed0 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69   nearby page exi
34ee0 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  sts.** anywhere 
34ef0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
34f00 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
34f10 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  ranteed to be re
34f20 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65  turned.  If.** e
34f30 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
34f40 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  LT then the page
34f50 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
34f60 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  e less than or e
34f70 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62  qual.** to nearb
34f80 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61  y if any such pa
34f90 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65  ge exists.  If e
34fa0 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
34fb0 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a  ANY then there.*
34fc0 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63  * are no restric
34fd0 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70  tions on which p
34fe0 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
34ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
35000 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
35010 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
35020 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t,         /* Th
35030 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  e btree */.  Mem
35040 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
35050 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69      /* Store poi
35060 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
35070 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20  cated page here 
35080 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
35090 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
350a0 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75  tore the page nu
350b0 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50  mber here */.  P
350c0 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20  gno nearby,     
350d0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
350e0 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20  for a page near 
350f0 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38  this one */.  u8
35100 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20   eMode          
35110 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f       /* BTALLOC_
35120 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c  EXACT, BTALLOC_L
35130 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e  T, or BTALLOC_AN
35140 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  Y */.){.  MemPag
35150 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
35160 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20   rc;.  u32 n;   
35170 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
35180 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
35190 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b  list */.  u32 k;
351a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
351b0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
351c0 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
351d0 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
351e0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
351f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
35200 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e  Trunk = 0;.  Pgn
35210 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a  o mxPage;     /*
35220 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
35230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35240 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
35250 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35260 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
35270 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
35280 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c  ==BTALLOC_ANY ||
35290 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 52 45   (nearby>0 && RE
352a0 51 55 49 52 45 5f 50 54 52 4d 41 50 20 29 20 29  QUIRE_PTRMAP ) )
352b0 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
352c0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
352d0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
352e0 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45  unt(pBt);.  /* E
352f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35  VIDENCE-OF: R-05
35300 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d  119-02637 The 4-
35310 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
35320 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
35330 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73  t 36.  ** stores
35340 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61   stores the tota
35350 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
35360 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
35370 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34  t. */.  n = get4
35380 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
35390 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
353a0 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
353b0 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
353c0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
353d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
353e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
353f0 2a 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20  * Ensure page 1 
35400 69 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69  is writable. Thi
35410 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
35420 65 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68  either change th
35430 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
35440 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72   pages in the fr
35450 65 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73  ee-list or the s
35460 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
35470 61 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20  ase file. Since 
35480 62 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  both.  ** of the
35490 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  se operations in
354a0 76 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20  volve modifying 
354b0 70 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69  page 1 header fi
354c0 65 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a  elds, page 1.  *
354d0 2a 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c  * will definitel
354e0 79 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20  y be written by 
354f0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
35500 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
35510 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20  CONCURRENT.  ** 
35520 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73  transaction, ens
35530 75 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72  ure the BtreePtr
35540 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61  map structure ha
35550 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
35560 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
35570 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35580 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
35590 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
355a0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e  rn rc;..  if( n>
355b0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
355c0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
355d0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
355e0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
355f0 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
35600 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
35610 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
35620 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
35630 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
35640 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
35650 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
35660 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
35670 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
35680 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
35690 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
356a0 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
356b0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
356c0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
356d0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
356e0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
356f0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
35700 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
35710 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
35720 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
35730 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
35740 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
35750 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
35760 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f    */.    if( eMo
35770 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
35780 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
35790 74 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21  t( ISAUTOVACUUM!
357a0 3d 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b  =ISCONCURRENT );
357b0 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
357c0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
357d0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
357e0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
357f0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
35800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
35810 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
35820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
35830 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
35840 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
35850 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
35860 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
35870 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35880 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
35890 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54            if( eT
358a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
358b0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
358c0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
358d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
358e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
358f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
35900 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
35910 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35920 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
35930 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
35940 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
35950 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
35960 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
35970 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
35980 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
35990 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
359a0 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
359b0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
359c0 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
359d0 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
359e0 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79     */.    put4by
359f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35a00 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
35a10 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
35a20 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
35a30 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
35a40 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
35a50 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
35a60 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
35a70 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
35a80 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
35a90 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
35aa0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
35ab0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
35ac0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
35ad0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
35ae0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
35af0 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
35b00 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
35b10 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
35b20 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
35b30 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
35b40 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
35b50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
35b60 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
35b70 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
35b80 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
35b90 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
35ba0 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
35bb0 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
35bc0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
35bd0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
35be0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
35bf0 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
35c00 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
35c10 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
35c20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
35c30 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
35c40 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
35c50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
35c60 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
35c70 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
35c80 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
35c90 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
35ca0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
35cb0 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
35cc0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
35cd0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
35ce0 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
35cf0 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
35d00 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
35d10 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
35d20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
35d30 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
35d40 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
35d50 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
35d60 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
35d70 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
35d80 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
35d90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
35da0 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
35db0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
35dc0 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
35dd0 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
35de0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35df0 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
35e00 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72  pPrevTrunk ? pPr
35e10 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20  evTrunk->pgno : 
35e20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
35e30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
35e40 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
35e50 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
35e60 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
35e70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
35e80 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
35e90 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
35ea0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
35eb0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
35ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
35ed0 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
35ee0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
35ef0 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
35f00 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
35f10 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
35f20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
35f30 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
35f40 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
35f50 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
35f60 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
35f70 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
35f80 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
35f90 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
35fa0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
35fb0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
35fc0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
35fd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
35fe0 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
35ff0 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
36000 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
36010 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
36020 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
36030 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
36040 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
36050 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
36060 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
36070 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
36080 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
36090 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
360a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
360b0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
360c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
360d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
360e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
360f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
36100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36110 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
36120 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
36130 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
36140 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
36150 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
36160 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
36170 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
36180 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
36190 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
361a0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
361b0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
361c0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
361d0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
361e0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
361f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
36200 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
36210 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
36220 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
36230 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
36240 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
36250 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
36260 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
36270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
36280 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
36290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
362a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
362b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
362c0 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
362d0 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
362e0 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
362f0 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
36300 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
36310 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
36320 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
36330 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
36340 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
36350 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
36360 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
36370 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
36380 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
36390 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
363a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
363b0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
363c0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
363d0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
363e0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
363f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
36400 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36410 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
36420 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
36430 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36440 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
36450 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
36460 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
36470 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
36480 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
36490 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
364a0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
364b0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
364c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
364d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
364e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
364f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36500 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
36510 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
36520 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
36530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36540 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
36550 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
36560 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
36570 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
36580 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
36590 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
365a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
365b0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
365c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
365d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
365e0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
365f0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
36600 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
36610 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
36620 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
36630 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
36640 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
36650 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
36660 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
36670 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
36680 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
36690 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
366a0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
366b0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
366c0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
366d0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
366e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
366f0 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
36700 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
36710 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
36720 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
36730 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
36740 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
36750 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
36760 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
36770 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
36780 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
36790 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
367a0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
367b0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
367c0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
367d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
367e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
367f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
36800 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
36810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
36820 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36830 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36840 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
36850 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
36860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
36880 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
36890 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
368a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
368b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
368c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
368d0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
368e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
368f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
36900 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
36910 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
36920 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
36930 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
36940 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
36950 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
36960 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
36970 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
36980 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36990 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
369a0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
369b0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
369c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
369d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
369e0 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
369f0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
36a00 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
36a10 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
36a20 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
36a30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
36a40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
36a50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36a60 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
36a70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
36a80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
36a90 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
36aa0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
36ab0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
36ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
36ad0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
36ae0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
36af0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
36b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
36b10 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
36b20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
36b30 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
36b40 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
36b50 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
36b60 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
36b70 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
36b80 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
36b90 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
36ba0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
36bb0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
36bc0 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
36bd0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
36be0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
36bf0 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
36c00 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
36c10 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
36c20 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
36c30 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
36c40 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
36c50 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
36c60 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
36c70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
36c80 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
36c90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
36ca0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
36cb0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
36cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
36cd0 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
36ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36cf0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
36d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
36d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36d30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36d50 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
36d60 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
36d70 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
36d80 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
36d90 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
36da0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
36db0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
36dd0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
36de0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
36df0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
36e00 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
36e10 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
36e20 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
36e30 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
36e40 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
36e50 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
36e60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
36e70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36e90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36ea0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
36eb0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
36ec0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
36ed0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
36ee0 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
36ef0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
36f00 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
36f10 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
36f20 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
36f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
36f40 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
36f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
36f60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
36f70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
36f80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
36f90 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
36fa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
36fb0 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
36fc0 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
36fd0 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
36fe0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
36ff0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
37000 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
37010 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
37020 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
37030 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
37040 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
37050 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
37060 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
37070 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
37080 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
37090 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
370a0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
370b0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
370c0 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
370d0 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
370e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
370f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37100 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
37110 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
37120 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
37130 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
37140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
37150 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
37160 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
37170 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
37180 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
37190 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
371a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
371b0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
371c0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
371d0 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
371e0 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
371f0 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
37200 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
37210 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
37220 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
37230 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
37240 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
37250 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
37260 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37280 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
37290 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
372a0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
372b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
372c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
372d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
372e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
372f0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
37300 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
37310 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
37320 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37330 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
37340 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
37350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
37360 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
37370 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
37380 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
37390 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
373a0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
373b0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
373c0 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
373d0 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
373e0 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
373f0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
37400 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
37410 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
37420 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
37430 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
37440 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
37450 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
37460 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
37470 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
37480 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
37490 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
374a0 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
374b0 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
374c0 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
374d0 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
374e0 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
374f0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
37500 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
37510 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
37520 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
37530 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
37540 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
37550 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
37560 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
37570 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
37580 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
37590 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
375a0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
375b0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
375c0 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
375d0 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
375e0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
375f0 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
37600 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
37610 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
37620 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
37630 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
37640 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
37650 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
37660 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
37670 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
37680 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
37690 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
376a0 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
376b0 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
376c0 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
376d0 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
376e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
376f0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
37700 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
37710 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
37720 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
37730 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
37740 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
37750 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
37760 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
37770 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
37780 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
37790 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
377a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
377b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
377c0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
377d0 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
377e0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
377f0 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
37800 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
37810 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
37820 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37830 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
37840 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
37850 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
37860 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
37870 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
37880 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
37890 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
378a0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
378b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
378c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
378d0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
378e0 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
378f0 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
37900 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
37910 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
37920 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
37930 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
37940 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
37950 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
37960 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
37970 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
37980 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
37990 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
379a0 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
379b0 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
379c0 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
379d0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
379e0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
379f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
37a00 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
37a10 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
37a20 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
37a30 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
37a40 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
37a50 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
37a60 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
37a70 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
37a80 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
37a90 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
37aa0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
37ab0 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
37ac0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
37ad0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37b00 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
37b10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
37b20 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
37b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37b40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37b50 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
37b60 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
37b70 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
37b80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
37b90 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
37ba0 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
37bb0 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
37bc0 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
37bd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
37be0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
37bf0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
37c00 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
37c10 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
37c20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
37c30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
37c40 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
37c50 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
37c60 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
37c70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
37c80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
37c90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37ca0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
37cb0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
37cc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37cd0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
37ce0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
37cf0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
37d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
37d10 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
37d20 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
37d30 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
37d40 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 43    }..  assert( C
37d50 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 2a 70 50  ORRUPT_DB || *pP
37d60 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
37d70 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
37d80 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
37d90 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
37da0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
37db0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
37dc0 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
37dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
37de0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
37df0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
37e00 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
37e10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
37e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
37e30 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
37e40 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
37e50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
37e60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
37e70 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
37e80 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
37e90 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
37ea0 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
37eb0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
37ec0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
37ed0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
37ee0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
37ef0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
37f00 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
37f10 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
37f20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
37f30 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
37f40 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
37f50 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
37f60 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
37f70 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
37f80 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
37f90 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
37fa0 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
37fb0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
37fc0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
37fd0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
37fe0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
37ff0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
38000 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
38010 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
38020 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
38030 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
38040 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
38050 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
38060 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
38070 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
38080 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
38090 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
380a0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
380b0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
380c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
380d0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
380e0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
380f0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
38100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38110 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
38120 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
38130 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
38140 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
38150 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
38160 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
38170 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
38180 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
38190 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
381a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
381b0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
381c0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
381d0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
381e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
38200 43 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6e 46  Code */.  u32 nF
38210 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
38220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38230 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
38240 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
38250 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
38260 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
38270 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
38280 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
38290 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
382a0 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
382b0 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
382c0 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
382d0 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
382e0 69 50 61 67 65 3c 32 20 7c 7c 20 69 50 61 67 65  iPage<2 || iPage
382f0 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20  >pBt->nPage ){. 
38300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38310 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
38320 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67   }.  if( pMemPag
38330 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
38340 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
38350 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
38360 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
38370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
38380 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
38390 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
383a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
383b0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
383c0 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
383d0 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
383e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
383f0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
38400 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
38410 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
38420 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
38430 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
38440 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
38450 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
38460 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
38470 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
38480 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
38490 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.