/ Hex Artifact Content
Login

Artifact aacef0cd0c57c2a1b2ed8a27794fc9e20b6e7a90:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 0a  ARED_CACHE */...
3a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3a80: 41 42 4c 45 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  ABLE_CONCURRENT.
3a90: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3aa0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2d 20  ing structure - 
3ab0: 42 74 72 65 65 50 74 72 6d 61 70 20 2d 20 73 74  BtreePtrmap - st
3ac0: 6f 72 65 73 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ores the in-memo
3ad0: 72 79 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 2a  ry pointer map.*
3ae0: 2a 20 75 73 65 64 20 66 6f 72 20 6e 65 77 6c 79  * used for newly
3af0: 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73   allocated pages
3b00: 20 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   in CONCURRENT t
3b10: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 53 75 63  ransactions. Suc
3b20: 68 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  h pages are.** a
3b30: 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 64 20  lways allocated 
3b40: 69 6e 20 61 20 63 6f 6e 74 69 67 75 6f 75 73 20  in a contiguous 
3b50: 62 6c 6f 63 6b 20 28 66 72 6f 6d 20 74 68 65 20  block (from the 
3b60: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 29  end of the file)
3b70: 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74   starting.** wit
3b80: 68 20 70 61 67 65 20 42 74 72 65 65 50 74 72 6d  h page BtreePtrm
3b90: 61 70 2e 69 46 69 72 73 74 2e 0a 2a 2f 0a 74 79  ap.iFirst..*/.ty
3ba0: 70 65 64 65 66 20 73 74 72 75 63 74 20 52 6f 6c  pedef struct Rol
3bb0: 6c 62 61 63 6b 45 6e 74 72 79 20 52 6f 6c 6c 62  lbackEntry Rollb
3bc0: 61 63 6b 45 6e 74 72 79 3b 0a 74 79 70 65 64 65  ackEntry;.typede
3bd0: 66 20 73 74 72 75 63 74 20 50 74 72 6d 61 70 45  f struct PtrmapE
3be0: 6e 74 72 79 20 50 74 72 6d 61 70 45 6e 74 72 79  ntry PtrmapEntry
3bf0: 3b 0a 73 74 72 75 63 74 20 50 74 72 6d 61 70 45  ;.struct PtrmapE
3c00: 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70 61  ntry {.  Pgno pa
3c10: 72 65 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65  rent;.  u8 eType
3c20: 3b 0a 7d 3b 0a 73 74 72 75 63 74 20 52 6f 6c 6c  ;.};.struct Roll
3c30: 62 61 63 6b 45 6e 74 72 79 20 7b 0a 20 20 50 67  backEntry {.  Pg
3c40: 6e 6f 20 70 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20  no pgno;.  Pgno 
3c50: 70 61 72 65 6e 74 3b 0a 20 20 75 38 20 65 54 79  parent;.  u8 eTy
3c60: 70 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20 42 74  pe;.};.struct Bt
3c70: 72 65 65 50 74 72 6d 61 70 20 7b 0a 20 20 50 67  reePtrmap {.  Pg
3c80: 6e 6f 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  no iFirst;      
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ca0: 20 46 69 72 73 74 20 6e 65 77 20 70 61 67 65 20   First new page 
3cb0: 6e 75 6d 62 65 72 20 61 50 74 72 5b 30 5d 20 2a  number aPtr[0] *
3cc0: 2f 0a 0a 20 20 69 6e 74 20 6e 50 74 72 41 6c 6c  /..  int nPtrAll
3cd0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
3ce0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
3cf0: 64 20 73 69 7a 65 20 6f 66 20 61 50 74 72 5b 5d  d size of aPtr[]
3d00: 20 61 72 72 61 79 20 2a 2f 0a 20 20 50 74 72 6d   array */.  Ptrm
3d10: 61 70 45 6e 74 72 79 20 2a 61 50 74 72 3b 20 20  apEntry *aPtr;  
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3d30: 72 72 61 79 20 6f 66 20 70 61 72 65 6e 74 20 70  rray of parent p
3d40: 61 67 65 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a  age numbers */..
3d50: 20 20 69 6e 74 20 6e 53 76 70 74 3b 20 20 20 20    int nSvpt;    
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65 20 6f    /* Used size o
3d80: 66 20 61 53 76 70 74 5b 5d 20 61 72 72 61 79 20  f aSvpt[] array 
3d90: 2a 2f 0a 20 20 69 6e 74 20 6e 53 76 70 74 41 6c  */.  int nSvptAl
3da0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
3db0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
3dc0: 64 20 73 69 7a 65 20 6f 66 20 61 53 76 70 74 5b  d size of aSvpt[
3dd0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 53 76 70  ] */.  int *aSvp
3de0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3df0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3e00: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 65 6e 74 72  aRollback[] entr
3e10: 79 20 66 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  y for savepoint 
3e20: 69 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c  i */..  int nRol
3e30: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
3e40: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
3e50: 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63  size of aRollbac
3e60: 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  k[] array */.  i
3e70: 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f  nt nRollbackAllo
3e80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
3e90: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
3ea0: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
3eb0: 61 72 72 61 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62  array */.  Rollb
3ec0: 61 63 6b 45 6e 74 72 79 20 2a 61 52 6f 6c 6c 62  ackEntry *aRollb
3ed0: 61 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 41 72  ack;       /* Ar
3ee0: 72 61 79 20 6f 66 20 72 6f 6c 6c 62 61 63 6b 20  ray of rollback 
3ef0: 65 6e 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  entries */.};../
3f00: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
3f10: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
3f20: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
3f30: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
3f40: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
3f50: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
3f60: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
3f70: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
3f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
3f90: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
3fa0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3fb0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
3fc0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
3fd0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
3fe0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
3ff0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
4000: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4010: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4020: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4030: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4040: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4050: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4060: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4070: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4080: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4090: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
40a0: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
40b0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
40c0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
40d0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
40e0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
40f0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
4100: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4110: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4120: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4130: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4140: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4150: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4160: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4170: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4180: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4190: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
41a0: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
41b0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
41c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
41d0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
41e0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
41f0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
4200: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4210: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4220: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4230: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4240: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4250: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4260: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4270: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4280: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4290: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
42a0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
42b0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
42c0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
42d0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
42e0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
42f0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
4300: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4310: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4320: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4330: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4340: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4350: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4360: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4370: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4380: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4390: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
43a0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
43b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
43c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
43d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
43e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
43f0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
4400: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4410: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4420: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4430: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4440: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4450: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4460: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4470: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4480: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4490: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
44a0: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
44b0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
44c0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
44d0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
44e0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
44f0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
4500: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4510: 55 70 64 61 74 65 20 74 68 65 20 61 50 74 72 5b  Update the aPtr[
4520: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 70  ] array */.    p
4530: 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79  Map->aPtr[iEntry
4540: 5d 2e 70 61 72 65 6e 74 20 3d 20 70 61 72 65 6e  ].parent = paren
4550: 74 3b 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50 74  t;.    pMap->aPt
4560: 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65 20  r[iEntry].eType 
4570: 3d 20 65 54 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  = eType;.  }..  
4580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
45a0: 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
45b0: 6f 69 6e 74 2c 20 69 66 20 69 74 20 69 73 20 6e  oint, if it is n
45c0: 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
45d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
45e0: 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28  treePtrmapBegin(
45f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
4600: 6e 74 20 6e 53 76 70 74 29 7b 0a 20 20 42 74 72  nt nSvpt){.  Btr
4610: 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d  eePtrmap *pMap =
4620: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66   pBt->pMap;.  if
4630: 28 20 70 4d 61 70 20 26 26 20 6e 53 76 70 74 3c  ( pMap && nSvpt<
4640: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20  pMap->nSvpt ){. 
4650: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
4660: 28 20 6e 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e  ( nSvpt>=pMap->n
4670: 53 76 70 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  SvptAlloc ){.   
4680: 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d     int nNew = pM
4690: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f  ap->nSvptAlloc ?
46a0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f   pMap->nSvptAllo
46b0: 63 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20 20 20  c*2 : 16;.      
46c0: 69 6e 74 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69  int *aNew = sqli
46d0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70  te3_realloc(pMap
46e0: 2d 3e 61 53 76 70 74 2c 20 73 69 7a 65 6f 66 28  ->aSvpt, sizeof(
46f0: 69 6e 74 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20  int) * nNew);.  
4700: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
4710: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4720: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4730: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4740: 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76 70 74       pMap->aSvpt
4750: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
4760: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f   pMap->nSvptAllo
4770: 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  c = nNew;.      
4780: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
4790: 28 69 3d 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20  (i=pMap->nSvpt; 
47a0: 69 3c 6e 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20  i<nSvpt; i++){. 
47b0: 20 20 20 20 20 70 4d 61 70 2d 3e 61 53 76 70 74       pMap->aSvpt
47c0: 5b 69 5d 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c  [i] = pMap->nRol
47d0: 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  lback;.    }.   
47e0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e   pMap->nSvpt = n
47f0: 53 76 70 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Svpt;.  }..  ret
4800: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4810: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
4820: 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49   (if op==SAVEPOI
4830: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72 20  NT_ROLLBACK) or 
4840: 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d 3d  release (if op==
4850: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
4860: 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  E).** savepoint 
4870: 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  iSvpt..*/.static
4880: 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d 61   void btreePtrma
4890: 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a 70  pEnd(BtShared *p
48a0: 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  Bt, int op, int 
48b0: 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  iSvpt){.  BtreeP
48c0: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
48d0: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
48e0: 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Map ){.    asser
48f0: 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
4900: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d  _ROLLBACK || op=
4910: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4920: 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  SE );.    assert
4930: 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28 69  ( iSvpt>=0 || (i
4940: 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  Svpt==-1 && op==
4950: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
4960: 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 69  CK) );.    if( i
4970: 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Svpt<0 ){.      
4980: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b  pMap->nSvpt = 0;
4990: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f  .      pMap->nRo
49a0: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
49b0: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e 61    memset(pMap->a
49c0: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Ptr, 0, sizeof(P
49d0: 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50 74  gno) * pMap->nPt
49e0: 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65 6c  rAlloc);.    }el
49f0: 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d 61  se if( iSvpt<pMa
4a00: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a10: 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
4a20: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
4a30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
4a40: 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 70          for(ii=p
4a50: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31  Map->nRollback-1
4a60: 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76 70  ; ii>=pMap->aSvp
4a70: 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29 7b  t[iSvpt]; ii--){
4a80: 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c 62  .          Rollb
4a90: 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26 70  ackEntry *p = &p
4aa0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69  Map->aRollback[i
4ab0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50 74  i];.          Pt
4ac0: 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72  rmapEntry *pEntr
4ad0: 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b  y = &pMap->aPtr[
4ae0: 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e  p->pgno - pMap->
4af0: 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20  iFirst];.       
4b00: 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e     pEntry->paren
4b10: 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20  t = p->parent;. 
4b20: 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d           pEntry-
4b30: 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
4b40: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
4b50: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70 2d     }.      pMap-
4b60: 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20 2b  >nSvpt = iSvpt +
4b70: 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
4b80: 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
4b90: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
4ba0: 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69   = pMap->aSvpt[i
4bb0: 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Svpt];.    }.  }
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
4bd0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4be0: 64 20 61 66 74 65 72 20 61 6e 20 43 4f 4e 43 55  d after an CONCU
4bf0: 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
4c00: 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  n is opened on t
4c10: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
4c20: 49 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  It allocates the
4c30: 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
4c40: 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 74  ucture used to t
4c50: 72 61 63 6b 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  rack pointers.**
4c60: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   to allocated pa
4c70: 67 65 73 20 61 6e 64 20 7a 65 72 6f 65 73 20 74  ges and zeroes t
4c80: 68 65 20 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20  he nFree/iTrunk 
4c90: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 64 61  fields in the da
4ca0: 74 61 62 61 73 65 20 0a 2a 2a 20 68 65 61 64 65  tabase .** heade
4cb0: 72 20 6f 6e 20 70 61 67 65 20 31 2e 0a 2a 2f 0a  r on page 1..*/.
4cc0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4cd0: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 42  PtrmapAllocate(B
4ce0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
4cf0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4d00: 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72 6d  _OK;.  BtreePtrm
4d10: 61 70 20 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74  ap *pMap = sqlit
4d20: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
4d30: 28 42 74 72 65 65 50 74 72 6d 61 70 29 29 3b 0a  (BtreePtrmap));.
4d40: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
4d50: 4d 61 70 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  Map==0 && sqlite
4d60: 33 50 61 67 65 72 49 73 43 6f 6e 63 75 72 72 65  3PagerIsConcurre
4d70: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
4d80: 29 3b 0a 20 20 69 66 28 20 70 4d 61 70 3d 3d 30  );.  if( pMap==0
4d90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
4da0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
4db0: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  se{.    memset(&
4dc0: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
4dd0: 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a 65 6f  ta[32], 0, sizeo
4de0: 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20 20 6d  f(u32)*2);.    m
4df0: 65 6d 73 65 74 28 70 4d 61 70 2c 20 30 2c 20 73  emset(pMap, 0, s
4e00: 69 7a 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61  izeof(BtreePtrma
4e10: 70 29 29 3b 0a 20 20 20 20 70 4d 61 70 2d 3e 69  p));.    pMap->i
4e20: 46 69 72 73 74 20 3d 20 70 42 74 2d 3e 6e 50 61  First = pBt->nPa
4e30: 67 65 20 2b 20 31 3b 0a 20 20 20 20 70 42 74 2d  ge + 1;.    pBt-
4e40: 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20  >pMap = pMap;.  
4e50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4e60: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
4e70: 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
4e80: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
4e90: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
4ea0: 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65 65 50  all to.** btreeP
4eb0: 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 29 2e  trmapAllocate().
4ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4ed0: 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74  btreePtrmapDelet
4ee0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
4ef0: 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70 20  {.  BtreePtrmap 
4f00: 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61  *pMap = pBt->pMa
4f10: 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29 7b  p;.  if( pMap ){
4f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4f30: 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63  e(pMap->aRollbac
4f40: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  k);.    sqlite3_
4f50: 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74 72 29  free(pMap->aPtr)
4f60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4f70: 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74 29 3b  ee(pMap->aSvpt);
4f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4f90: 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70 42 74  e(pMap);.    pBt
4fa0: 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20 7d 0a  ->pMap = 0;.  }.
4fb0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
4fc0: 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
4fd0: 63 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f  cate(x) SQLITE_O
4fe0: 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  K.# define btree
4ff0: 50 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20  PtrmapDelete(x) 
5000: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
5010: 74 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20  trmapBegin(x,y) 
5020: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
5030: 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45  ine btreePtrmapE
5040: 6e 64 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  nd(x,y,z) .#endi
5050: 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  f..static void r
5060: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
5070: 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20  ge *pPage);  /* 
5080: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5090: 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54  e */../*.***** T
50a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
50b0: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
50c0: 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a  sert() only ****
50d0: 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  .**.** Verify th
50e0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f  at the cursor ho
50f0: 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  lds the mutex on
5100: 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f   its BtShared.*/
5110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5120: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5130: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5140: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
5150: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
5160: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
5170: 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  t->mutex);.}.#en
5180: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  dif../*.** Inval
5190: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
51a0: 6f 77 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  ow cache of the 
51b0: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
51c0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
51d0: 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ent..** on the s
51e0: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
51f0: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64  cture pBt..*/.#d
5200: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
5210: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
5220: 75 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  ur) (pCur->curFl
5230: 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c  ags &= ~BTCF_Val
5240: 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49  idOvfl)../*.** I
5250: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
5260: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
5270: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
5280: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
5290: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
52a0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
52b0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
52c0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
52d0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
52e0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
52f0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
5300: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5310: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5320: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
5330: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5340: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5350: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
5360: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
5370: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5380: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
5390: 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  OB./*.** This fu
53a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
53b0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
53c0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
53d0: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
53e0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
53f0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
5400: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
5410: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
5420: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
5430: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
5440: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
5450: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
5460: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
5470: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
5480: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
5490: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
54a0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
54b0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
54c0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
54d0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
54e0: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
54f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5500: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
5510: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
5520: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
5530: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
5540: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
5550: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
5560: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
5570: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
5580: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
5590: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
55a0: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
55b0: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
55c0: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
55d0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
55e0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
55f0: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
5600: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
5610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5620: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
5630: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34  o check */.  i64
5640: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
5650: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
5660: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
5670: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
5680: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
5690: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
56a0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
56b0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
56c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
56d0: 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68  .  if( pBtree->h
56e0: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30  asIncrblobCur==0
56f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
5700: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
5710: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72  eHoldsMutex(pBtr
5720: 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d  ee) );.  pBtree-
5730: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
5740: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  = 0;.  for(p=pBt
5750: 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
5760: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5770: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63  ){.    if( (p->c
5780: 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49  urFlags & BTCF_I
5790: 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20  ncrblob)!=0 ){. 
57a0: 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73       pBtree->has
57b0: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b  IncrblobCur = 1;
57c0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 43 6c 65  .      if( isCle
57d0: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
57e0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 20 29 7b  fo.nKey==iRow ){
57f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5800: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
5810: 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LID;.      }.   
5820: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
5830: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
5840: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
5850: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
5860: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
5870: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
5880: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
5890: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
58a0: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
58b0: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
58c0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
58d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
58e0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
58f0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
5900: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
5910: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
5920: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
5930: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
5940: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
5950: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
5960: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
5970: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
5980: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
5990: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
59a0: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
59b0: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
59c0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
59d0: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
59e0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
59f0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
5a00: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
5a10: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
5a20: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
5a30: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
5a40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
5a50: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
5a60: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
5a70: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
5a80: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
5a90: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
5aa0: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
5ab0: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
5ac0: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
5ad0: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
5ae0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
5af0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
5b00: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
5b10: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
5b20: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
5b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
5b40: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
5b50: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
5b60: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
5b70: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
5b80: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
5b90: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
5ba0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5bb0: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
5bc0: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
5bd0: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
5be0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
5bf0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
5c00: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
5c10: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
5c20: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
5c30: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
5c40: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
5c50: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
5c60: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
5c70: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
5c80: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
5c90: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
5ca0: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
5cb0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
5cc0: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
5cd0: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
5ce0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
5cf0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
5d00: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
5d10: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
5d20: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
5d30: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
5d40: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
5d50: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
5d60: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
5d70: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
5d80: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
5d90: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
5da0: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
5db0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
5dc0: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
5dd0: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
5de0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
5df0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
5e00: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
5e10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
5e20: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
5e30: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
5e40: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5e50: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
5e60: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
5e70: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
5e80: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
5e90: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
5ea0: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
5eb0: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
5ec0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
5ed0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
5ee0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
5ef0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
5f00: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
5f10: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
5f20: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
5f30: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
5f40: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
5f50: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
5f60: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
5f70: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
5f80: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
5f90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
5fa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5fb0: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
5fc0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5fd0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
5fe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5ff0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
6000: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
6010: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
6020: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
6030: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6040: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
6050: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
6060: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
6070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
6080: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6090: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
60a0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
60b0: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
60c0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
60d0: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
60e0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
60f0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
6100: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
6110: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
6120: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6130: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
6140: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
6150: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
6160: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6170: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
6180: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
6190: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
61a0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
61b0: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
61c0: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
61d0: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
61e0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
61f0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
6200: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
6210: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
6220: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
6230: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
6240: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
6250: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
6260: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6270: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
6280: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
6290: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
62a0: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
62b0: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
62c0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
62d0: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
62e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
62f0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
6300: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6310: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
6320: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
6330: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
6340: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
6350: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6360: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
6370: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
6380: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
6390: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
63a0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
63b0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
63c0: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
63d0: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
63e0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
63f0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
6400: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
6410: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
6420: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
6430: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
6440: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6450: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6460: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
6470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
6480: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
6490: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
64a0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
64b0: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
64c0: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
64d0: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
64e0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
64f0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
6500: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
6510: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
6520: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
6530: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
6540: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
6550: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
6560: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
6570: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
6580: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
6590: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
65a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
65b0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
65c0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
65d0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
65e0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
65f0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
6600: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
6610: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6620: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6630: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
6640: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
6650: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
6660: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
6670: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
6680: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
6690: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
66a0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
66b0: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
66c0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
66d0: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
66e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
66f0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
6700: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
6710: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
6720: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
6730: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
6740: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
6750: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
6760: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
6770: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
6780: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
6790: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
67a0: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
67b0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
67c0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
67d0: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
67e0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
67f0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
6800: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
6810: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
6820: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
6830: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
6840: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
6850: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
6860: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
6870: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
6880: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
6890: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
68a0: 30 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  0==pCur->curIntK
68b0: 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ey ){.    void *
68c0: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
68d0: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
68e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
68f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6900: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
6910: 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75  Cur, 0, (int)pCu
6920: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
6930: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6940: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6950: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6960: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
6970: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6980: 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
6990: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
69a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
69b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
69c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
69d0: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
69e0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
69f0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
6a00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
6a10: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
6a20: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
6a30: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
6a40: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
6a50: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
6a60: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
6a70: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
6a80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
6a90: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
6aa0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
6ab0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
6ac0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
6ad0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
6ae0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
6af0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
6b00: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
6b10: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
6b20: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
6b30: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
6b40: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
6b50: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
6b60: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
6b70: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
6b80: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
6b90: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
6ba0: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
6bb0: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
6bc0: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
6bd0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
6be0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
6bf0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
6c00: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
6c10: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
6c20: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
6c30: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
6c40: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
6c50: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
6c60: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
6c70: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
6c80: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
6c90: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
6ca0: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
6cb0: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
6cc0: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
6cd0: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
6ce0: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
6cf0: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
6d00: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
6d10: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
6d20: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
6d30: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
6d40: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
6d50: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
6d60: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
6d70: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
6d80: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
6d90: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
6da0: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
6db0: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
6dc0: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
6dd0: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
6de0: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
6df0: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
6e00: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
6e10: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
6e20: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
6e30: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
6e40: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
6e50: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
6e60: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
6e70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
6e80: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
6e90: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
6ea0: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
6eb0: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
6ec0: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
6ed0: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
6ee0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
6ef0: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
6f00: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
6f10: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
6f20: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
6f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6f40: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
6f50: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6f60: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
6f70: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
6f80: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
6f90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6fa0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6fb0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
6fc0: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
6fd0: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
6fe0: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
6ff0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
7000: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
7010: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7020: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7030: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7040: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
7050: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
7060: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
7070: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
7080: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
7090: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
70a0: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
70b0: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
70c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
70d0: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
70e0: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
70f0: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
7100: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
7110: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
7120: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
7130: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
7140: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
7150: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
7160: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
7170: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
7180: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
7190: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
71a0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
71b0: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
71c0: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
71d0: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
71e0: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
71f0: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
7200: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
7210: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
7220: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
7230: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
7240: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
7250: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
7260: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
7270: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
7280: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
7290: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
72a0: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
72b0: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
72c0: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
72d0: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
72e0: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
72f0: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
7300: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7310: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7320: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7330: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
7340: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
7350: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
7360: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7370: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
7380: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
7390: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
73a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
73b0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
73c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
73d0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
73e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
73f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
7400: 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Page>0 );.      
7410: 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
7420: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b  lCursorPages(p);
7430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7440: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
7450: 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a  .  }while( p );.
7460: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7470: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
7480: 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ar the current c
7490: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
74a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
74b0: 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
74c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
74d0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
74e0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
74f0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
7500: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
7510: 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20  .  pCur->pKey = 
7520: 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  0;.  pCur->eStat
7530: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
7540: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  ID;.}../*.** In 
7550: 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
7560: 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
7570: 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
7580: 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
7590: 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
75a0: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
75b0: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
75c0: 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
75d0: 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
75e0: 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
75f0: 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
7600: 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61  the work..*/.sta
7610: 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76  tic int btreeMov
7620: 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
7630: 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
7640: 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
7650: 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
7660: 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
7670: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
7680: 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
7690: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
76a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
76b0: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
76c0: 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
76d0: 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
76e0: 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
76f0: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
7700: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
7710: 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
7720: 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
7730: 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
7740: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
7750: 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
7760: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
7770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7780: 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
7790: 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
77a0: 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
77b0: 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
77c0: 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63  index key */.  c
77d0: 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b  har aSpace[200];
77e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
77f0: 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78  p space for pIdx
7800: 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  Key - to avoid a
7810: 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61   malloc */.  cha
7820: 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20  r *pFree = 0;.. 
7830: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
7840: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
7850: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
7860: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
7870: 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
7880: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
7890: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
78a0: 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73  yInfo, aSpace, s
78b0: 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26  izeof(aSpace), &
78c0: 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20  pFree.    );.   
78d0: 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
78e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
78f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74  NOMEM;.    sqlit
7900: 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
7910: 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
7920: 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b  o, (int)nKey, pK
7930: 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
7940: 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e    if( pIdxKey->n
7950: 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Field==0 ){.    
7960: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7970: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
7980: 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20  db, pFree);.    
7990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
79a0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
79b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
79c0: 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
79d0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
79e0: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
79f0: 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
7a00: 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
7a10: 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65  Res);.  if( pFre
7a20: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
7a30: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
7a40: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
7a50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7a60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
7a70: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
7a80: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
7a90: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
7aa0: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
7ab0: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
7ac0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
7ad0: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
7ae0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
7af0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
7b00: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
7b10: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
7b20: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
7b30: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
7b40: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
7b50: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
7b60: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
7b70: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
7b80: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
7b90: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7ba0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
7bb0: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
7bc0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
7bd0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
7be0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69  nt rc;.  int ski
7bf0: 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  pNext;.  assert(
7c00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
7c10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
7c20: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7c30: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
7c40: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
7c50: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
7c60: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
7c70: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
7c80: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
7c90: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
7ca0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
7cb0: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
7cc0: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
7cd0: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
7ce0: 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69   &skipNext);.  i
7cf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7d00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7d10: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
7d20: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
7d30: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
7d40: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
7d50: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
7d60: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
7d70: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
7d80: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
7d90: 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a  xt |= skipNext;.
7da0: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
7db0: 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e  ipNext && pCur->
7dc0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7dd0: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43  ALID ){.      pC
7de0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
7df0: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
7e00: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7e10: 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20   rc;.}..#define 
7e20: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
7e30: 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d  ition(p) \.  (p-
7e40: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
7e50: 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a  REQUIRESEEK ? \.
7e60: 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65           btreeRe
7e70: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
7e80: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
7e90: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
7ea0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
7eb0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
7ec0: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
7ed0: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
7ee0: 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ion where.** it 
7ef0: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c  was last placed,
7f00: 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76   or has been inv
7f10: 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79  alidated for any
7f20: 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a   other reason..*
7f30: 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f  * Cursors can mo
7f40: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
7f50: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
7f60: 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20  g at is deleted 
7f70: 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65  out.** from unde
7f80: 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d  r them, for exam
7f90: 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67  ple.  Cursor mig
7fa0: 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20  ht also move if 
7fb0: 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65  a btree.** is re
7fc0: 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
7fd0: 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
7fe0: 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c  tine with a NULL
7ff0: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20   cursor pointer 
8000: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a  returns false..*
8010: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70  *.** Use the sep
8020: 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72  arate sqlite3Btr
8030: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
8040: 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73  ) routine to res
8050: 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a  tore a cursor.**
8060: 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69   back to where i
8070: 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66  t ought to be if
8080: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
8090: 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  turns true..*/.i
80a0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
80b0: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
80c0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
80d0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53   return pCur->eS
80e0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
80f0: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ID;.}../*.** Thi
8100: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72  s routine restor
8110: 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b  es a cursor back
8120: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
8130: 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20   position after 
8140: 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  it.** has been m
8150: 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74  oved by some out
8160: 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73  side activity (s
8170: 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72  uch as a btree r
8180: 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61  ebalance or.** a
8190: 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e   row having been
81a0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
81b0: 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
81c0: 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20  or).  .**.** On 
81d0: 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44  success, the *pD
81e0: 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61  ifferentRow para
81f0: 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69  meter is false i
8200: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
8210: 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
8220: 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20   at exactly the 
8230: 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66  same row.  *pDif
8240: 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20  ferntRow is the 
8250: 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  row the cursor.*
8260: 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74  * was pointing t
8270: 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  o has been delet
8280: 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20  ed, forcing the 
8290: 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
82a0: 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62  to some.** nearb
82b0: 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  y row..**.** Thi
82c0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
82d0: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
82e0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
82f0: 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a  t just returned.
8300: 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c  ** TRUE from sql
8310: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
8320: 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e  asMoved()..*/.in
8330: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
8340: 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75  rsorRestore(BtCu
8350: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
8360: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b  *pDifferentRow){
8370: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8380: 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
8390: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
83a0: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
83b0: 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20  VALID );.  rc = 
83c0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
83d0: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
83e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44  f( rc ){.    *pD
83f0: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
8400: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8410: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
8420: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
8430: 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69  ALID ){.    *pDi
8440: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
8450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8460: 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
8470: 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ext==0 );.    *p
8480: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30  DifferentRow = 0
8490: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
84a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
84b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
84c0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
84d0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
84e0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
84f0: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
8500: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
8510: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
8520: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
8530: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
8540: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
8550: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
8560: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
8570: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
8580: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
8590: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
85a0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
85b0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
85c0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
85d0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
85e0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
85f0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
8600: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
8610: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
8620: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
8630: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
8640: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
8650: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
8660: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
8670: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
8680: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8690: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
86a0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
86b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
86c0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
86d0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
86e0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
86f0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
8700: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
8710: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
8720: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
8730: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
8740: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
8750: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
8760: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
8770: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
8780: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
8790: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
87a0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
87b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
87c0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
87d0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
87e0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
87f0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
8800: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
8810: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
8820: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
8830: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
8840: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
8850: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
8860: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
8870: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
8880: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
8890: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
88a0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
88b0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
88c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
88d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
88e0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
88f0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8900: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
8910: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
8920: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
8930: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
8940: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8950: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8960: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
8970: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
8980: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
8990: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
89a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
89b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
89c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
89d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
89e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
89f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8a00: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8a10: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
8a20: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
8a30: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
8a40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8a50: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8a60: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
8a70: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
8a80: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6e  page number is n
8a90: 65 76 65 72 20 61 64 64 65 64 20 74 6f 20 61 20  ever added to a 
8aa0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
8ab0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
8ac0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
8ad0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
8ae0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
8af0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8b00: 41 42 4c 45 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  ABLE_CONCURRENT.
8b10: 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61 70 20    if( pBt->pMap 
8b20: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 62 74  ){.    *pRC = bt
8b30: 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28 70  reePtrmapStore(p
8b40: 42 74 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  Bt, key, eType, 
8b50: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 72 65 74  parent);.    ret
8b60: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
8b70: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
8b80: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
8b90: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
8ba0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
8bb0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8bc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8bd0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8be0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8bf0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8c00: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8c10: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8c20: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
8c30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8c40: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
8c50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8c60: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8c70: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8c80: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8c90: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8ca0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
8cb0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8cc0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
8cd0: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
8ce0: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
8cf0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
8d00: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
8d10: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
8d20: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
8d30: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
8d40: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
8d50: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
8d60: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
8d70: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
8d80: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
8d90: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
8da0: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
8db0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
8dc0: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
8dd0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
8de0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
8df0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8e00: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
8e10: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
8e20: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
8e30: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8e40: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
8e50: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
8e60: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
8e70: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8e80: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
8e90: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
8ea0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
8eb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8ec0: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
8ed0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
8ee0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
8ef0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
8f00: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
8f10: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
8f20: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
8f30: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
8f40: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
8f50: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8f60: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
8f70: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
8f80: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
8f90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
8fa0: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
8fb0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
8fc0: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
8fd0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
8fe0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
8ff0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9000: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
9010: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
9020: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
9030: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
9040: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
9050: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
9060: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
9070: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
9080: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
9090: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
90a0: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
90b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
90c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
90d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
90e0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
90f0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
9100: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
9110: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
9120: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
9130: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
9140: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
9150: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
9160: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
9170: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
9180: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
9190: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
91a0: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
91b0: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
91c0: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
91d0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
91e0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
91f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9200: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9210: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9220: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
9230: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
9240: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
9250: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
9260: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
9270: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
9280: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
9290: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
92a0: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
92b0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
92c0: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
92d0: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
92e0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
92f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9310: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
9320: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
9330: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9340: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
9350: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
9360: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
9370: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
9380: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
9390: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
93a0: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
93b0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
93c0: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
93d0: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
93e0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
93f0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
9400: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
9410: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
9420: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
9430: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
9440: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
9450: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
9460: 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  * findCellPastPt
9470: 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d  r() does the sam
9480: 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70  e except it skip
9490: 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69  s past the initi
94a0: 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69  al.** 4-byte chi
94b0: 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64  ld pointer found
94c0: 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   on interior pag
94d0: 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  es, if there is 
94e0: 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  one..**.** This 
94f0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
9500: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
9510: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
9520: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
9530: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
9540: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
9550: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
9560: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
9570: 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50  2byteAligned(&(P
9580: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
9590: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
95a0: 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c  ndCellPastPtr(P,
95b0: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
95c0: 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d  taOfst + ((P)->m
95d0: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
95e0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
95f0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
9600: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
9610: 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70  is common tail p
9620: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74  rocessing for bt
9630: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
9640: 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61  ) and.** btreePa
9650: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9660: 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  ) for the case w
9670: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65  hen the cell doe
9680: 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65  s not fit entire
9690: 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c  ly.** on a singl
96a0: 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20  e B-tree page.  
96b0: 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61  Make necessary a
96c0: 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68  djustments to th
96d0: 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74  e CellInfo.** st
96e0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
96f0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
9700: 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  NE void btreePar
9710: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9720: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d  ForOverflow(.  M
9730: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9740: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9750: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9760: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9770: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9780: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9790: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
97a0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
97b0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
97c0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
97d0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49  ure */.){.  /* I
97e0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
97f0: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
9800: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
9810: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
9820: 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20  .  ** to decide 
9830: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
9840: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
9850: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
9860: 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c  onto.  ** overfl
9870: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
9880: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
9890: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
98a0: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a  t of unused.  **
98b0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
98c0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
98d0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
98e0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
98f0: 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  ge.  ** in betwe
9900: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
9910: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20  maxLocal..  **. 
9920: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
9930: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
9940: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
9950: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
9960: 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77  n any.  ** way w
9970: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
9980: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
9990: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a  le format..  */.
99a0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
99b0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
99c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
99d0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
99e0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
99f0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
9a00: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9a10: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9a20: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
9a30: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
9a40: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
9a50: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
9a60: 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  .  minLocal = pP
9a70: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
9a80: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
9a90: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73  e->maxLocal;.  s
9aa0: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
9ab0: 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79  l + (pInfo->nPay
9ac0: 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  load - minLocal)
9ad0: 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  %(pPage->pBt->us
9ae0: 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74  ableSize-4);.  t
9af0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
9b00: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
9b10: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
9b20: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  s==maxLocal+1 );
9b30: 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c  .  if( surplus <
9b40: 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  = maxLocal ){.  
9b50: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9b60: 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a  = (u16)surplus;.
9b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
9b80: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9b90: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  6)minLocal;.  }.
9ba0: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
9bb0: 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66  ow = (u16)(&pInf
9bc0: 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66  o->pPayload[pInf
9bd0: 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65  o->nLocal] - pCe
9be0: 6c 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  ll);.  pInfo->nS
9bf0: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
9c00: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f  erflow + 4;.}../
9c10: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
9c20: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
9c30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
9c40: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
9c50: 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d  ParseCell().** m
9c60: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ethod..**.** Par
9c70: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
9c80: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
9c90: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
9ca0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
9cb0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
9cc0: 50 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20  Ptr()        => 
9cd0: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65    table btree le
9ce0: 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  af nodes.** btre
9cf0: 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c  eParseCellNoPayl
9d00: 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c  oad()  =>   tabl
9d10: 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c  e btree internal
9d20: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
9d30: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
9d40: 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20  ()   =>   index 
9d50: 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a  btree nodes.**.*
9d60: 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20  * There is also 
9d70: 61 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69  a wrapper functi
9d80: 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  on btreeParseCel
9d90: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
9da0: 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67  or.** all MemPag
9db0: 65 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74  e types and that
9dc0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
9dd0: 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61  cell by index ra
9de0: 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20  ther than.** by 
9df0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
9e00: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9e10: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
9e20: 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad(.  MemPage *p
9e30: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9e40: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9e50: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
9e60: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
9e70: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9e80: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
9e90: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
9ea0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9eb0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9ec0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9f00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9f10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a  age->leaf==0 );.
9f20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9f30: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  >noPayload );.  
9f40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9f50: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
9f60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9f70: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
9f80: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
9f90: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
9fa0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9fb0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9fc0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9fd0: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
9fe0: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
9ff0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a000: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76   0;.  pInfo->iOv
a010: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49  erflow = 0;.  pI
a020: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
a030: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73  0;.  return;.}.s
a040: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
a050: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
a060: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a070: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a080: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a090: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a0a0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a0b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a0c0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a0d0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a0e0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a0f0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a100: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a110: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a120: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a130: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a140: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a150: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a160: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a170: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a180: 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79  ad */.  u64 iKey
a190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1a0: 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79  /* Extracted Key
a1b0: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73   value */..  ass
a1c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a1d0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a1e0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a1f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
a200: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
a210: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
a220: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
a230: 4b 65 79 4c 65 61 66 20 7c 7c 20 70 50 61 67 65  KeyLeaf || pPage
a240: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20  ->noPayload );. 
a250: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a260: 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a  noPayload==0 );.
a270: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a280: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20  >intKeyLeaf );. 
a290: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a2a0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
a2b0: 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65  );.  pIter = pCe
a2c0: 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ll;..  /* The ne
a2d0: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
a2e0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
a2f0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
a300: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
a310: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61  int32(pIter, nPa
a320: 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a  yload);.  **.  *
a330: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
a340: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
a350: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
a360: 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20    */.  nPayload 
a370: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
a380: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
a390: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
a3a0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
a3b0: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
a3c0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
a3d0: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
a3e0: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
a3f0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
a400: 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65    }while( (*pIte
a410: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
a420: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
a430: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  pIter++;..  /* T
a440: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
a450: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
a460: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
a470: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
a480: 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20  etVarint(pIter, 
a490: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
a4a0: 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ey);.  **.  ** T
a4b0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
a4c0: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
a4d0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
a4e0: 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65  /.  iKey = *pIte
a4f0: 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30  r;.  if( iKey>=0
a500: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
a510: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b  End = &pIter[7];
a520: 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37  .    iKey &= 0x7
a530: 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  f;.    while(1){
a540: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69  .      iKey = (i
a550: 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  Key<<7) | (*++pI
a560: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a570: 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c     if( (*pIter)<
a580: 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  0x80 ) break;.  
a590: 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70      if( pIter>=p
a5a0: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69  End ){.        i
a5b0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20  Key = (iKey<<8) 
a5c0: 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20  | *++pIter;.    
a5d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a5e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
a5f0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f  Iter++;..  pInfo
a600: 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29  ->nKey = *(i64*)
a610: 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e  &iKey;.  pInfo->
a620: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a630: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a640: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a650: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a660: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a670: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a680: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a690: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a6a0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a6b0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a6c0: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a6d0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a6e0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a6f0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a700: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a710: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a720: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a730: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a740: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a750: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a760: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a770: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a780: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a790: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a7a0: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a7b0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a7c0: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66  ayload;.    pInf
a7d0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30  o->iOverflow = 0
a7e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
a7f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a  treeParseCellAdj
a800: 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c  ustSizeForOverfl
a810: 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ow(pPage, pCell,
a820: 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73   pInfo);.  }.}.s
a830: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
a840: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
a850: 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x(.  MemPage *pP
a860: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
a870: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
a880: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
a890: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
a8a0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a8b0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
a8c0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
a8d0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
a8e0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
a8f0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a900: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
a910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
a920: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
a930: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
a940: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
a950: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a960: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
a970: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
a980: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a990: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a9a0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a9b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a9c0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
a9d0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
a9e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
a9f0: 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  tKeyLeaf==0 );. 
aa00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
aa10: 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a  noPayload==0 );.
aa20: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20    pIter = pCell 
aa30: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
aa40: 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61  rSize;.  nPayloa
aa50: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
aa60: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
aa70: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
aa80: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
aa90: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
aaa0: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
aab0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
aac0: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
aad0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
aae0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
aaf0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
ab00: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
ab10: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e    pIter++;.  pIn
ab20: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
ab30: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  oad;.  pInfo->nP
ab40: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
ab50: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  d;.  pInfo->pPay
ab60: 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20  load = pIter;.  
ab70: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
ab80: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
ab90: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
aba0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
abb0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
abc0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
abd0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
abe0: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
abf0: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
ac00: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
ac10: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
ac20: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
ac30: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
ac40: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
ac50: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
ac60: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
ac70: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
ac80: 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  + (u16)(pIter - 
ac90: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
aca0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29  pInfo->nSize<4 )
acb0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
acc0: 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  4;.    pInfo->nL
acd0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
ace0: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
acf0: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
ad00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
ad10: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
ad20: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
ad30: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
ad40: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
ad50: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
ad60: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
ad70: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
ad80: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
ad90: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
ada0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
adc0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
add0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
ade0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
adf0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
ae00: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
ae10: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
ae20: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
ae30: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
ae40: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
ae50: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
ae60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
ae70: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
ae80: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
ae90: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
aea0: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
aeb0: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
aec0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
aed0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
aee0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
aef0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
af00: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
af10: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
af20: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
af30: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
af40: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
af50: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
af60: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
af70: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
af80: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
af90: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
afa0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
afb0: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
afc0: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
afd0: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
afe0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
b000: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
b010: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
b020: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
b030: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
b040: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
b050: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
b060: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
b070: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b080: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
b090: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
b0a0: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
b0b0: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
b0e0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
b0f0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b120: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
b130: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
b140: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
b150: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
b160: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
b170: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
b180: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
b190: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
b1a0: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
b1b0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
b1c0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
b1d0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
b1e0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
b1f0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
b200: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
b210: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
b220: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
b230: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
b240: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
b250: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
b260: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
b270: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
b280: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
b290: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
b2a0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
b2b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61  ert( pPage->noPa
b2c0: 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 6e 53  yload==0 );.  nS
b2d0: 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  ize = *pIter;.  
b2e0: 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20  if( nSize>=0x80 
b2f0: 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  ){.    pEnd = &p
b300: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69  Iter[8];.    nSi
b310: 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ze &= 0x7f;.    
b320: 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20  do{.      nSize 
b330: 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28  = (nSize<<7) | (
b340: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
b350: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
b360: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
b370: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
b380: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69  }.  pIter++;.  i
b390: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
b3a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72   ){.    /* pIter
b3b0: 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74   now points at t
b3c0: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
b3d0: 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76  r key value, a v
b3e0: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a  ariable length .
b3f0: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
b400: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
b410: 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20  ock moves pIter 
b420: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
b430: 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a  first byte.    *
b440: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
b450: 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  f the key value.
b460: 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26   */.    pEnd = &
b470: 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68  pIter[9];.    wh
b480: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
b490: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
b4a0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74  nd );.  }.  test
b4b0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
b4c0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
b4d0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
b4e0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
b4f0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53  al+1 );.  if( nS
b500: 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize<=pPage->maxL
b510: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a  ocal ){.    nSiz
b520: 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72  e += (u32)(pIter
b530: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
b540: 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69  f( nSize<4 ) nSi
b550: 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 4;.  }else{
b560: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
b570: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
b580: 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  cal;.    nSize =
b590: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69   minLocal + (nSi
b5a0: 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25  ze - minLocal) %
b5b0: 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
b5c0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
b5d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
b5e0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
b5f0: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
b600: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
b610: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
b620: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  .    if( nSize>p
b630: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
b640: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
b650: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
b660: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b      nSize += 4 +
b670: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
b680: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Cell);.  }.  ass
b690: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
b6a0: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43  ginfo.nSize || C
b6b0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
b6c0: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
b6d0: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
b6e0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
b6f0: 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  oad(MemPage *pPa
b700: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
b710: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43    u8 *pIter = pC
b720: 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20  ell + 4; /* For 
b730: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
b740: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
b750: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
b760: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d          /* End m
b770: 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74  ark for a varint
b780: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
b790: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
b7a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
b7b0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
b7c0: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
b7d0: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
b7e0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
b7f0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
b800: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
b810: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
b820: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
b830: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
b840: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
b850: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
b860: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
b870: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
b880: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
b890: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
b8a0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
b8b0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
b8c0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b8d0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b8e0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
b8f0: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
b900: 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a  RAMETER(pPage);.
b910: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
b920: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
b930: 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45  rSize==4 );.  pE
b940: 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a  nd = pIter + 9;.
b950: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
b960: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
b970: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65  r<pEnd );.  asse
b980: 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53  rt( debuginfo.nS
b990: 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72  ize==(u16)(pIter
b9a0: 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52   - pCell) || COR
b9b0: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
b9c0: 75 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20  urn (u16)(pIter 
b9d0: 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69  - pCell);.}...#i
b9e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
b9f0: 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74  G./* This variat
ba00: 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50  ion on cellSizeP
ba10: 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73  tr() is used ins
ba20: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
ba30: 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  statements.** on
ba40: 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31  ly. */.static u1
ba50: 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  6 cellSize(MemPa
ba60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
ba70: 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  Cell){.  return 
ba80: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
ba90: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
baa0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
bab0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
bac0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
bad0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
bae0: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
baf0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
bb00: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
bb10: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
bb20: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
bb30: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
bb40: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
bb50: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
bb60: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
bb70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bb80: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
bb90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
bba0: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
bbb0: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
bbc0: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
bbd0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
bbe0: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
bbf0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
bc00: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
bc10: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
bc20: 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
bc30: 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66   ){.    Pgno ovf
bc40: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
bc50: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
bc60: 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  ow]);.    ptrmap
bc70: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
bc80: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
bc90: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
bca0: 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d  gno, pRC);.  }.}
bcb0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
bcc0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
bcd0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
bce0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
bcf0: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
bd00: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
bd10: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
bd20: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
bd30: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
bd40: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
bd50: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
bd60: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
bd70: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
bd80: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
bd90: 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45  nt area..**.** E
bda0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
bdb0: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
bdc0: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
bdd0: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
bde0: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
bdf0: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
be00: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
be10: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
be20: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
be30: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
be40: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
be50: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
be60: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
be70: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
be80: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
be90: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
bea0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
beb0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
bec0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
bed0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
bf00: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
bf30: 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  e i-th cell */. 
bf40: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bf60: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
bf70: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
bf80: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
bf90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
bfa0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
bfb0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
bfc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bfd0: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
bfe0: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
bff0: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
c000: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
c010: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
c020: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
c030: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
c040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c050: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
c060: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
c070: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
c080: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
c090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c0a0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
c0b0: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
c0c0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
c0d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
c0e0: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
c0f0: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
c100: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
c110: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
c120: 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ent */.  unsigne
c130: 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20  d char *src;    
c140: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66      /* Source of
c150: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
c160: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
c170: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c180: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
c190: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
c1a0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
c1b0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
c1c0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
c1d0: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
c1e0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
c1f0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
c200: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
c210: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
c220: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
c230: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
c240: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
c250: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
c260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
c270: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
c280: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
c290: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c2a0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
c2b0: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
c2c0: 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61   0;.  src = data
c2d0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
c2e0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
c2f0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
c300: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
c310: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
c320: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
c330: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
c340: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
c350: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
c360: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
c370: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c380: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
c390: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43  usableSize;.  iC
c3a0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
c3b0: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b  ffset + 2*nCell;
c3c0: 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
c3d0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
c3e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
c3f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
c400: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
c410: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
c420: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
c430: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
c440: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
c450: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
c460: 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63  Addr);.    testc
c470: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
c480: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
c490: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
c4a0: 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  st );.    /* The
c4b0: 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61  se conditions ha
c4c0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
c4d0: 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65  verified in btre
c4e0: 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20  eInitPage().    
c4f0: 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c  ** if PRAGMA cel
c500: 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e  l_size_check=ON.
c510: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c520: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
c530: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
c540: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c550: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c560: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
c570: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
c580: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
c590: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
c5a0: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
c5b0: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
c5c0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
c5d0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
c5e0: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
c5f0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c600: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c610: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c620: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
c630: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72  .    assert( cbr
c640: 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  k+size<=usableSi
c650: 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c  ze && cbrk>=iCel
c660: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
c670: 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a  stcase( cbrk+siz
c680: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
c690: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c6a0: 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  c+size==usableSi
c6b0: 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ze );.    put2by
c6c0: 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b  te(pAddr, cbrk);
c6d0: 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30  .    if( temp==0
c6e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b   ){.      int x;
c6f0: 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d  .      if( cbrk=
c700: 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =pc ) continue;.
c710: 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c        temp = sql
c720: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
c730: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
c740: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20  Pager);.      x 
c750: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c760: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
c770: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c  memcpy(&temp[x],
c780: 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b   &data[x], (cbrk
c790: 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20  +size) - x);.   
c7a0: 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20     src = temp;. 
c7b0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
c7c0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72  &data[cbrk], &sr
c7d0: 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  c[pc], size);.  
c7e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
c7f0: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c800: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c810: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
c820: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c830: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c840: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
c850: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
c860: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
c870: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
c880: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
c890: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c8a0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c8b0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c8c0: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
c8d0: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
c8e0: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
c8f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c900: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
c910: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c920: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
c930: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
c940: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
c950: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
c960: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
c970: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
c980: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
c990: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c9a0: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
c9b0: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
c9c0: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
c9d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
c9e0: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
c9f0: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
ca00: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
ca10: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
ca20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
ca30: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
ca40: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
ca50: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
ca60: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
ca70: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
ca80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
ca90: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
caa0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74  rned..**.** Slot
cab0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
cac0: 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77  st that are betw
cad0: 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65  een 1 and 3 byte
cae0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42  s larger than nB
caf0: 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  yte.** will be i
cb00: 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67  gnored if adding
cb10: 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65   the extra space
cb20: 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74   to the fragment
cb30: 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63  ation count.** c
cb40: 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65  auses the fragme
cb50: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f  ntation count to
cb60: 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73   exceed 60..*/.s
cb70: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69  tatic u8 *pageFi
cb80: 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a  ndSlot(MemPage *
cb90: 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  pPg, int nByte, 
cba0: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e  int *pRc){.  con
cbb0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
cbc0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
cbd0: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
cbe0: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
cbf0: 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20  int iAddr = hdr 
cc00: 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20  + 1;.  int pc = 
cc10: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
cc20: 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78  iAddr]);.  int x
cc30: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
cc40: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
cc50: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73  sableSize;..  as
cc60: 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20  sert( pc>0 );.  
cc70: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  do{.    int size
cc80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cc90: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
cca0: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
ccb0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
ccc0: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
ccd0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
cce0: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
ccf0: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
cd00: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
cd10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
cd20: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
cd30: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
cd40: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
cd50: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cd60: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
cd70: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
cd80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
cd90: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
cda0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
cdb0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
cdc0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
cdd0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
cde0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
cdf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
ce00: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
ce10: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
ce20: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
ce30: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
ce40: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
ce50: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
ce60: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
ce70: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
ce80: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
ce90: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
cea0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
ceb0: 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d     if( pc < pPg-
cec0: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
ced0: 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65  g->nCell || size
cee0: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
cef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
cf00: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
cf10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
cf20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
cf30: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
cf40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
cf50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
cf60: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
cf70: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
cf80: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
cf90: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
cfa0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
cfb0: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
cfc0: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
cfd0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
cfe0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
cff0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
d000: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
d010: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
d020: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
d030: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
d040: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
d050: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
d060: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
d070: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
d080: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
d090: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
d0a0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
d0b0: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
d0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
d0d0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
d0e0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
d0f0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
d100: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
d110: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
d120: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
d130: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
d140: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
d150: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
d160: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
d170: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
d180: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
d190: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
d1a0: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
d1b0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
d1c0: 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  c]);.  }while( p
d1d0: 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30  c );..  return 0
d1e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d1f0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d200: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d210: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d220: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d230: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d240: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d250: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d260: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d270: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d280: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d290: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d2a0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d2b0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d2c0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d2d0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d2e0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d2f0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d300: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d310: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d320: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d330: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d340: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d350: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d360: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d370: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d380: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d390: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d3a0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d3b0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d3c0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d3d0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d3e0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d3f0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d400: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d410: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d420: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d430: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d440: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d450: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d460: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d480: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d490: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d4a0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d4b0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d4c0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d4d0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d4e0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d4f0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d500: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d510: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d520: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d530: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d540: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d550: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d570: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d580: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d590: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d5a0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d5c0: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d5d0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d5e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d5f0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d600: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d610: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d620: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
d630: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d640: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
d650: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
d660: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d670: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
d680: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d690: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d6a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d6b0: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
d6c0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
d6d0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
d6e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d6f0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
d700: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d710: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
d720: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
d730: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
d740: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
d750: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
d760: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
d770: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
d780: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
d790: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
d7a0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
d7b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
d7c0: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
d7d0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
d7e0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
d7f0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
d800: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
d810: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
d820: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d830: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d840: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d850: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d860: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d870: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d880: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d890: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
d8a0: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
d8b0: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
d8c0: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
d8d0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
d8e0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
d8f0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
d900: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
d910: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
d920: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
d930: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
d940: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
d950: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
d960: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
d970: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
d980: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
d990: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
d9a0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
d9b0: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
d9c0: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
d9d0: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
d9e0: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
d9f0: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
da00: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
da10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
da20: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
da30: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
da40: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
da50: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
da60: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
da70: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
da80: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
da90: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
daa0: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
dab0: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
dac0: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
dad0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
dae0: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
daf0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
db00: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
db10: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
db20: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
db30: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
db40: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
db50: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
db60: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
db70: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
db80: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
db90: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
dba0: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
dbb0: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
dbc0: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
dbd0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
dbe0: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
dbf0: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
dc00: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
dc10: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
dc20: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
dc30: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
dc40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
dc50: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
dc60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
dc80: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
dc90: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
dca0: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
dcb0: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
dcc0: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
dcd0: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
dce0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
dcf0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
dd00: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
dd10: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
dd20: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
dd30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
dd40: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
dd50: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
dd60: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
dd70: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
dd80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
dd90: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
dda0: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
ddb0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
ddc0: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
ddd0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
dde0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
ddf0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
de00: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
de10: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
de20: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
de30: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
de40: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
de50: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
de60: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
de70: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
de80: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
de90: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
dea0: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
deb0: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
dec0: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
ded0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
dee0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
def0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
df00: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
df10: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
df20: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
df30: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
df40: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
df50: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
df60: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
df70: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
df80: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
df90: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
dfa0: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
dfb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
dfc0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
dfd0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
dfe0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
dff0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
e000: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
e010: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
e020: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
e030: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
e040: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e050: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
e060: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
e070: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
e080: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
e090: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
e0a0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
e0b0: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
e0c0: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
e0d0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
e0e0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
e0f0: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
e100: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
e110: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
e120: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
e130: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
e140: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
e150: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
e160: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
e170: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
e180: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
e190: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
e1a0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
e1b0: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
e1c0: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
e1d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e1e0: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
e1f0: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
e200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
e210: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
e220: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
e230: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
e240: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e270: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
e280: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
e290: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e2c0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
e2d0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
e2e0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
e310: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
e320: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
e330: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e350: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
e360: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
e370: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
e380: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
e390: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
e3a0: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
e3b0: 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d  */.  u32 iLast =
e3c0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
e3d0: 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61  bleSize-4; /* La
e3e0: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
e3f0: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
e400: 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20  */.  u32 iEnd = 
e410: 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20  iStart + iSize; 
e420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e430: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
e440: 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20  e iStart buffer 
e450: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
e460: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
e470: 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61  ->aData;   /* Pa
e480: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ge content */.. 
e490: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e4a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
e4b0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e4c0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
e4d0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
e4e0: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
e4f0: 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70  _DB || iStart>=p
e500: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
e510: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
e520: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
e530: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
e540: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
e550: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e560: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e570: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e580: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e590: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
e5a0: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
e5b0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
e5c0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
e5d0: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61  ert( iStart<=iLa
e5e0: 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72  st );..  /* Over
e5f0: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
e600: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
e610: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
e620: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
e630: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
e640: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ed */.  if( pPag
e650: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
e660: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
e670: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
e680: 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  et(&data[iStart]
e690: 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  , 0, iSize);.  }
e6a0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
e6b0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
e6c0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
e6d0: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
e6e0: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
e6f0: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
e700: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
e710: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
e720: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
e730: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
e740: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
e750: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
e760: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
e770: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
e780: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
e790: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
e7a0: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
e7b0: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
e7c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
e7d0: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
e7e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e7f0: 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72  iPtr]))>0 && iFr
e800: 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a  eeBlk<iStart ){.
e810: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
e820: 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75  lk<iPtr+4 ) retu
e830: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e840: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50  T_BKPT;.      iP
e850: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
e860: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
e870: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
e880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e890: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
e8a0: 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69  sert( iFreeBlk>i
e8b0: 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d  Ptr || iFreeBlk=
e8c0: 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  =0 );.  .    /* 
e8d0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20  At this point:. 
e8e0: 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c     **    iFreeBl
e8f0: 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62  k:   First freeb
e900: 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72  lock after iStar
e910: 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  t, or zero if no
e920: 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74  ne.    **    iPt
e930: 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64  r:       The add
e940: 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65  ress of a pointe
e950: 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20  r to iFreeBlk.  
e960: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63    **.    ** Chec
e970: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65  k to see if iFre
e980: 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63  eBlk should be c
e990: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
e9a0: 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e  e end of iStart.
e9b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e9c0: 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64  iFreeBlk && iEnd
e9d0: 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a  +3>=iFreeBlk ){.
e9e0: 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46        nFrag = iF
e9f0: 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20  reeBlk - iEnd;. 
ea00: 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46       if( iEnd>iF
ea10: 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20  reeBlk ) return 
ea20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ea30: 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  KPT;.      iEnd 
ea40: 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74  = iFreeBlk + get
ea50: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
ea60: 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20  eBlk+2]);.      
ea70: 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65  if( iEnd > pPage
ea80: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
ea90: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
eaa0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
eab0: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
eac0: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
ead0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
eae0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
eaf0: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
eb00: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
eb10: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
eb20: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
eb30: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
eb40: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
eb50: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
eb60: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
eb70: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
eb80: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
eb90: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
eba0: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
ebb0: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
ebc0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
ebd0: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
ebe0: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
ebf0: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
ec00: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
ec10: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
ec20: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
ec30: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
ec40: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
ec50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ec60: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  KPT;.        nFr
ec70: 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
ec80: 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
ec90: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
eca0: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
ecb0: 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
ecc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ecd0: 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
ece0: 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
ecf0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ed00: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
ed10: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
ed20: 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65    if( iStart==ge
ed30: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ed40: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  +5]) ){.    /* T
ed50: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
ed60: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
ed70: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
ed80: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
ed90: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
eda0: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
edb0: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
edc0: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
edd0: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
ede0: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
edf0: 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72     if( iPtr!=hdr
ee00: 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +1 ) return SQLI
ee10: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ee20: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
ee30: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
ee40: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
ee50: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
ee60: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
ee70: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
ee80: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
ee90: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
eea0: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
eeb0: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
eec0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75   iStart);.    pu
eed0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
eee0: 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  art], iFreeBlk);
eef0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
ef00: 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69  ata[iStart+2], i
ef10: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Size);.  }.  pPa
ef20: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
ef30: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
ef40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ef50: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ef60: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
ef70: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ef80: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ef90: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
efa0: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
efb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
efc0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
efd0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
efe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
eff0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
f000: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
f010: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
f020: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
f030: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
f040: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
f050: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
f060: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
f070: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
f080: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
f090: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
f0a0: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
f0b0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f0c0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
f0d0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
f0e0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
f0f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
f100: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
f110: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
f120: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
f130: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
f140: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f150: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
f160: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
f170: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
f180: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f190: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f1a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f1b0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
f1c0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
f1d0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
f1e0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
f1f0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
f200: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
f210: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
f220: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
f230: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
f240: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
f250: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
f260: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
f270: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
f280: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f290: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) ){.    /* EVID
f2a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30  ENCE-OF: R-03640
f2b0: 2d 31 33 34 31 35 20 41 20 76 61 6c 75 65 20 6f  -13415 A value o
f2c0: 66 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70 61  f 5 means the pa
f2d0: 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f  ge is an interio
f2e0: 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62  r.    ** table b
f2f0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f300: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f310: 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
f320: 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f  KEY)==5 );.    /
f330: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f340: 2d 32 30 35 30 31 2d 36 31 37 39 36 20 41 20 76  -20501-61796 A v
f350: 61 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e 73  alue of 13 means
f360: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c   the page is a l
f370: 65 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  eaf.    ** table
f380: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
f390: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
f3a0: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
f3b0: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d  NTKEY|PTF_LEAF)=
f3c0: 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =13 );.    pPage
f3d0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
f3e0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
f3f0: 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  f ){.      pPage
f400: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31  ->intKeyLeaf = 1
f410: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ;.      pPage->n
f420: 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  oPayload = 0;.  
f430: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
f440: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
f450: 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d  seCellPtr;.    }
f460: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
f470: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
f480: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  0;.      pPage->
f490: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b 0a 20  noPayload = 1;. 
f4a0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c       pPage->xCel
f4b0: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
f4c0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
f4d0: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
f4e0: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
f4f0: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
f500: 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ad;.    }.    pP
f510: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
f520: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
f530: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
f540: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
f550: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
f560: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
f570: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
f580: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37  VIDENCE-OF: R-27
f590: 32 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75  225-53936 A valu
f5a0: 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65  e of 2 means the
f5b0: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65   page is an inte
f5c0: 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65  rior.    ** inde
f5d0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f5e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f5f0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
f600: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f610: 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31  CE-OF: R-16571-1
f620: 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20  1615 A value of 
f630: 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  10 means the pag
f640: 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20  e is a leaf.    
f650: 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  ** index b-tree 
f660: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f670: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
f680: 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30  TA|PTF_LEAF)==10
f690: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
f6a0: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
f6b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
f6c0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
f6d0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  >noPayload = 0;.
f6e0: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
f6f0: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
f700: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a  seCellPtrIndex;.
f710: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
f720: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
f730: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
f740: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
f750: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
f760: 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  e{.    /* EVIDEN
f770: 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35  CE-OF: R-47608-5
f780: 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76  6469 Any other v
f790: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74  alue for the b-t
f7a0: 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73  ree page type is
f7b0: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
f7c0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
f7d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f7e0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  KPT;.  }.  pPage
f7f0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
f800: 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74  d = pBt->max1byt
f810: 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  ePayload;.  retu
f820: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f830: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
f840: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
f850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
f860: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
f870: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
f880: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
f890: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
f8a0: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
f8b0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
f8c0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
f8d0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
f8e0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
f8f0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
f900: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
f910: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
f920: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
f930: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f940: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
f950: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
f960: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
f970: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
f980: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
f990: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
f9a0: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
f9b0: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
f9c0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
f9d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f9e0: 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20  age->pBt->db!=0 
f9f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
fa00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fa10: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
fa20: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
fa30: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
fa40: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
fa50: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
fa60: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
fa70: 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
fa80: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
fa90: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
faa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fab0: 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
fac0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
fad0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fae0: 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
faf0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
fb00: 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20  u16 pc;         
fb10: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
fb20: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
fb30: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
fb40: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72  [] */.    u8 hdr
fb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fb60: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
fb70: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
fb80: 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61  er */.    u8 *da
fb90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
fba0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
fbb0: 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53  aData */.    BtS
fbc0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
fbd0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
fbe0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
fbf0: 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  /.    int usable
fc00: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
fc10: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
fc20: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
fc30: 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  */.    u16 cellO
fc40: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
fc50: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
fc60: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
fc70: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
fc80: 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20      int nFree;  
fc90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
fca0: 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
fcb0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
fcc0: 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20      int top;    
fcd0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
fce0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
fcf0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
fd00: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  .    int iCellFi
fd10: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
fd20: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
fd30: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fd40: 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  set */.    int i
fd50: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  CellLast;     /*
fd60: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
fd70: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
fd80: 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20   offset */..    
fd90: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
fda0: 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  ;..    hdr = pPa
fdb0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
fdc0: 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
fdd0: 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45  >aData;.    /* E
fde0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
fdf0: 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e  594-02890 The on
fe00: 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f  e-byte flag at o
fe10: 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69  ffset 0 indicati
fe20: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d  ng.    ** the b-
fe30: 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20  tree page type. 
fe40: 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64  */.    if( decod
fe50: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
fe60: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
fe70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fe80: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
fe90: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
fea0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
feb0: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
fec0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  .    pPage->mask
fed0: 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
fee0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
fef0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
ff00: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
ff10: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
ff20: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
ff30: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
ff40: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
ff50: 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
ff60: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
ff70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
ff80: 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61  aEnd = &data[usa
ff90: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50  bleSize];.    pP
ffa0: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
ffb0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
ffc0: 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  ];.    pPage->aD
ffd0: 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b  ataOfst = &data[
ffe0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
fff0: 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49  ize];.    /* EVI
10000 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
10010 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
10020 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
10030 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
10040 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  tes.    ** the s
10050 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
10060 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
10070 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
10080 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
10090 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74      ** interpret
100a0 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
100b0 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
100c0 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
100d0 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20  hdr+5]);.    /* 
100e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
100f0 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
10100 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10110 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
10120 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
10130 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
10140 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
10150 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
10160 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
10170 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
10180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
10190 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
101a0 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
101b0 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
101c0 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
101d0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
101e0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
101f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10200 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
10210 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
10220 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
10230 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45  pBt) );.    /* E
10240 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
10250 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
10260 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
10270 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
10280 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73  only.    ** poss
10290 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
102a0 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
102b0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
102c0 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
102d0 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f      ** offset to
102e0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
102f0 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
10300 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
10310 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a  minus the.    **
10320 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
10330 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ed space. */.   
10340 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10350 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
10360 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
10370 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20  RRUPT_DB );..   
10380 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
10390 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
103a0 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
103b0 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
103c0 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
103d0 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
103e0 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
103f0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
10400 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
10410 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
10420 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
10430 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
10440 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
10450 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
10460 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
10470 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
10480 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
10490 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
104a0 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
104b0 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
104c0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
104d0 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
104e0 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
104f0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62  .    if( pBt->db
10500 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
10510 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20  _CellSizeCk ){. 
10520 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
10530 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10540 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
10550 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
10560 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
10570 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10580 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
10590 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
105a0 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
105b0 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
105c0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
105d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
105e0 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69  pc = get2byteAli
105f0 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f  gned(&data[cellO
10600 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
10610 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
10620 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
10630 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10640 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
10650 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
10660 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
10670 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
10680 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10690 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
106a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
106b0 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 70 50  .        sz = pP
106c0 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
106d0 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
106e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
106f0 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
10700 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
10710 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
10720 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10740 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10760 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
10770 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
10780 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a  ast++;.    }  ..
10790 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
107a0 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
107b0 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
107c0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
107d0 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35  OF: R-23588-3445
107e0 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  0 The two-byte i
107f0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
10800 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   1 gives the.   
10810 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65   ** start of the
10820 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
10830 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72   on the page, or
10840 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72   is zero if ther
10850 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20  e are no.    ** 
10860 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
10870 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
10880 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
10890 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
108a0 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20  [hdr+7] + top;  
108b0 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f  /* Init nFree to
108c0 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66   non-freeblock f
108d0 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ree space */.   
108e0 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
108f0 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
10900 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
10910 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
10920 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
10930 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
10940 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30  ENCE-OF: R-55530
10950 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c  -52930 In a well
10960 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
10970 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a  age, there will.
10980 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
10990 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  s be at least on
109a0 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68  e cell before th
109b0 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
109c0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
109d0 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65        ** Or, the
109e0 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66   freeblock is of
109f0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
10a00 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f   page.        */
10a10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10a20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10a30 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
10a40 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
10a50 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
10a60 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
10a70 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
10a80 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e  ]);.      if( (n
10a90 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70  ext>0 && next<=p
10aa0 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b  c+size+3) || pc+
10ab0 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
10ac0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
10ad0 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
10ae0 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
10af0 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61  rder. And the la
10b00 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20  st byte of.     
10b10 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62     ** the free-b
10b20 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e  lock must lie on
10b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
10b40 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
10b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10b60 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
10b70 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
10b80 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
10b90 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
10ba0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10bb0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
10bc0 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
10bd0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
10be0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10bf0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  .    ** of the c
10c00 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10c10 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
10c20 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
10c30 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ithin.    ** the
10c40 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
10c50 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
10c60 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
10c70 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20  usable-size.    
10c80 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
10c90 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
10ca0 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
10cb0 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
10cc0 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74  .    ** serves t
10cd0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
10ce0 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10cf0 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10d00 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  l-content.    **
10d10 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
10d20 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
10d30 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
10d40 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a   the page..    *
10d50 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e  /.    if( nFree>
10d60 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10d70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10d80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
10d90 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
10da0 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
10db0 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
10dc0 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  st);.    pPage->
10dd0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
10de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10df0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
10e00 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
10e10 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
10e20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
10e30 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
10e40 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
10e50 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
10e60 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
10e70 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
10e80 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10e90 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
10ea0 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
10eb0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
10ec0 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
10ed0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
10ee0 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
10ef0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10f00 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
10f10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
10f20 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
10f30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10f40 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
10f50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10f60 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
10f70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10f80 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
10f90 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10fa0 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
10fb0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10fc0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
10fd0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
10fe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10ff0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11000 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
11010 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
11020 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
11030 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
11040 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
11050 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11060 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64   - hdr);.  }.  d
11070 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
11080 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
11090 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26  = hdr + ((flags&
110a0 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31  PTF_LEAF)==0 ? 1
110b0 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74  2 : 8);.  memset
110c0 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
110d0 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
110e0 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
110f0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
11100 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
11110 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
11120 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ee = (u16)(pBt->
11130 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
11140 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  st);.  decodeFla
11150 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
11160 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
11170 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
11180 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
11190 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73   = &data[pBt->us
111a0 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
111b0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
111c0 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70  data[first];.  p
111d0 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
111e0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
111f0 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
11200 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
11210 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
11220 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
11230 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
11240 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
11250 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
11260 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
11270 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
11280 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
11290 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
112a0 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
112b0 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
112c0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
112d0 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
112e0 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
112f0 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
11300 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
11310 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
11320 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
11330 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
11340 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
11350 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
11360 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
11370 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
11380 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
11390 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
113a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
113b0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
113c0 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
113d0 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
113e0 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
113f0 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
11400 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
11410 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f  hdrOffset = pgno
11420 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
11430 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
11440 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
11450 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
11460 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
11470 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
11480 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
11490 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
114a0 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
114b0 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
114c0 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
114d0 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
114e0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
114f0 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
11500 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
11510 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
11520 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
11530 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
11540 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
11550 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
11560 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
11570 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
11580 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
11590 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
115a0 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
115b0 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
115c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
115d0 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
115e0 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
115f0 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
11600 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
11610 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
11620 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
11630 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
11640 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
11650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
11660 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
11670 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11680 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11690 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
116a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
116b0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
116c0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
116d0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
116e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
116f0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11700 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11710 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
11720 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
11730 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
11740 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
11750 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
11760 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
11770 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
11780 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
11790 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
117a0 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
117b0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
117c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
117d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
117e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
117f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11800 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
11810 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
11820 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
11830 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
11840 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
11850 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
11860 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
11870 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
11880 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
11890 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
118a0 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
118b0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
118c0 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
118d0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
118e0 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
118f0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
11900 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
11910 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
11920 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
11930 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
11940 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
11950 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
11960 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
11970 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
11980 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
11990 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
119a0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
119b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
119c0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
119d0 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
119e0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
119f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
11a00 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
11a10 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
11a20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11a30 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
11a40 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
11a50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
11a60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
11a70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
11a80 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
11a90 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
11aa0 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
11ab0 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
11ac0 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
11ad0 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
11ae0 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
11af0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
11b00 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
11b10 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
11b20 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
11b30 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
11b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
11b50 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
11b60 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
11b70 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
11b80 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
11b90 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  rn btreePagecoun
11ba0 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a  t(p->pBt);.}../*
11bb0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11bc0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
11bd0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
11be0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d  .**.** If pCur!=
11bf0 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  0 then the page 
11c00 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64  is being fetched
11c10 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f   as part of a mo
11c20 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63  veToChild().** c
11c30 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f  all.  Do additio
11c40 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
11c50 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
11c60 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
11c70 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63   And if the fetc
11c80 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f  h fails, this ro
11c90 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65  utine must decre
11ca0 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65  ment pCur->iPage
11cb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
11cc0 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72   is fetched as r
11cd0 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73  ead-write unless
11ce0 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c   pCur is not NUL
11cf0 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65  L and is.** a re
11d00 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a  ad-only cursor..
11d10 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
11d20 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a  r occurs, then *
11d30 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69  ppPage is undefi
11d40 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
11d50 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
11d60 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
11d70 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
11d80 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
11d90 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
11da0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11db0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
11dc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
11dd0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
11de0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
11e10 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
11e20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
11e30 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
11e40 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11e50 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
11e60 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
11e70 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
11e80 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
11e90 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20   to receive the 
11ea0 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  page, or NULL */
11eb0 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79  .  int bReadOnly
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
11ee0 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20   read-only page 
11ef0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
11f00 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
11f10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
11f20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11f30 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11f40 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
11f50 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75   || ppPage==&pCu
11f60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
11f70 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
11f80 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62  rt( pCur==0 || b
11f90 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e  ReadOnly==pCur->
11fa0 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b  curPagerFlags );
11fb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
11fc0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  =0 || pCur->iPag
11fd0 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  e>0 );..  if( pg
11fe0 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
11ff0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63  t(pBt) ){.    rc
12000 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12010 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
12020 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
12030 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20  error;.  }.  rc 
12040 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
12050 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
12060 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
12070 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65  **)&pDbPage, bRe
12080 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72  adOnly);.  if( r
12090 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65  c ){.    goto ge
120a0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
120b0 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  or;.  }.  *ppPag
120c0 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
120d0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
120e0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 69   pgno, pBt);.  i
120f0 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  f( (*ppPage)->is
12100 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Init==0 ){.    r
12110 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
12120 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
12130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12140 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12150 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
12160 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41  .      goto getA
12170 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12190 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61  * If obtaining a
121a0 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20   child page for 
121b0 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73  a cursor, we mus
121c0 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  t verify that th
121d0 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63  e page is.  ** c
121e0 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
121f0 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f  he root page. */
12200 0a 20 20 69 66 28 20 70 43 75 72 0a 20 20 20 26  .  if( pCur.   &
12210 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43  & ((*ppPage)->nC
12220 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67  ell<1 || (*ppPag
12230 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  e)->intKey!=pCur
12240 2d 3e 63 75 72 49 6e 74 4b 65 79 29 0a 20 20 29  ->curIntKey).  )
12250 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12260 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12270 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12280 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f  *ppPage);.    go
12290 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
122a0 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
122b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
122c0 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  ..getAndInitPage
122d0 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43  _error:.  if( pC
122e0 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65  ur ) pCur->iPage
122f0 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  --;.  testcase( 
12300 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pgno==0 );.  ass
12310 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20  ert( pgno!=0 || 
12320 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
12330 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  PT );.  return r
12340 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
12350 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
12360 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
12370 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
12380 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
12390 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  l to btreeGetPag
123a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
123b0 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  d releasePageNot
123c0 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Null(MemPage *pP
123d0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
123e0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
123f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12400 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
12410 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
12420 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12430 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12440 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
12450 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
12460 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
12470 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12480 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
12490 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
124a0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
124b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
124c0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
124d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
124e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
124f0 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62  tNull(pPage->pDb
12500 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
12510 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12520 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12530 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20  {.  if( pPage ) 
12540 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
12550 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  ll(pPage);.}../*
12560 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65  .** Get an unuse
12570 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d page..**.** Th
12580 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
12590 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ke btreeGetPage(
125a0 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  ) with the addit
125b0 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ion:.**.**   *  
125c0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  If the page is a
125d0 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f  lready in use fo
125e0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
125f0 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c  pose, immediatel
12600 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73  y.**      releas
12610 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  e it and return 
12620 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50  an SQLITE_CURRUP
12630 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20  T error..**   * 
12640 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69   Make sure the i
12650 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c  sInit flag is cl
12660 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ear.*/.static in
12670 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  t btreeGetUnused
12680 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
12690 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
126a0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
126b0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
126c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
126d0 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
126e0 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
126f0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
12700 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
12710 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
12720 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
12730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12740 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
12750 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
12760 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
12770 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47   int rc = btreeG
12780 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
12790 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29  , ppPage, flags)
127a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
127b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
127c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
127d0 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
127e0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
127f0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
12800 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
12810 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
12820 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12830 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12840 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
12850 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
12860 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12870 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
12880 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12890 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  }.../*.** During
128a0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
128b0 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
128c0 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
128d0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
128e0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
128f0 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
12900 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
12910 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
12920 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
12930 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
12940 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
12950 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12960 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
12970 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
12980 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
12990 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
129a0 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
129b0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
129c0 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
129d0 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
129e0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
129f0 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
12a00 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
12a10 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
12a20 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
12a30 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12a40 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
12a50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12a60 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
12a70 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
12a80 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
12a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
12aa0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12ab0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
12ac0 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
12ad0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
12ae0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12af0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
12b00 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
12b10 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
12b20 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
12b30 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
12b40 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
12b50 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
12b60 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
12b70 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
12b80 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
12b90 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
12ba0 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
12bb0 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
12bc0 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
12bd0 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
12be0 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
12bf0 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
12c00 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
12c10 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
12c20 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
12c30 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
12c40 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
12c50 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
12c60 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
12c70 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
12c80 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
12c90 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
12ca0 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
12cb0 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
12cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12cd0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
12ce0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
12cf0 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
12d00 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
12d10 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
12d20 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
12d30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
12d40 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
12d50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
12d60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12d70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12d80 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
12d90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
12da0 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
12db0 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
12dc0 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
12dd0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
12de0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
12df0 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
12e00 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12e10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12e20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12e30 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e   NULL.** then an
12e40 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
12e50 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ase is created. 
12e60 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   The ephemeral d
12e70 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a  atabase might.**
12e80 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20   be exclusively 
12e90 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74  in memory, or it
12ea0 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73   might use a dis
12eb0 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63  k-based memory c
12ec0 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20  ache..** Either 
12ed0 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72  way, the ephemer
12ee0 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  al database will
12ef0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
12f00 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68  y deleted .** wh
12f10 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
12f20 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
12f30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
12f40 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
12f50 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
12f60 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
12f70 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
12f80 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
12f90 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
12fa0 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
12fb0 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22  *.** The "flags"
12fc0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
12fd0 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67  bitmask that mig
12fe0 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20  ht contain bits 
12ff0 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d  like.** BTREE_OM
13000 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f  IT_JOURNAL and/o
13010 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a  r BTREE_MEMORY..
13020 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
13030 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
13040 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73   opened in the s
13050 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
13060 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77  nection.** and w
13070 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20  e are in shared 
13080 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
13090 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66   the open will f
130a0 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53  ail with an.** S
130b0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
130c0 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e   error.  We cann
130d0 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20  ot allow two or 
130e0 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a  more BtShared.**
130f0 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
13100 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
13110 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64  nnection since d
13120 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61  oing so will lea
13130 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73  d.** to problems
13140 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   with locking..*
13150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13160 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  eeOpen(.  sqlite
13170 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
13180 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
13190 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20  for this b-tree 
131a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
131b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
131c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
131d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
131e0 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
131f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
13200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13210 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
13220 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
13230 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
13240 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
13250 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
13260 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
13270 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
13280 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
13290 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
132a0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
132b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
132c0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
132d0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
132e0 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42  Open() */.){.  B
132f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
13300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13310 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
13320 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
13330 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
13360 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
13370 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
13380 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
13390 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
133a0 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
133b0 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
133c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
133d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
133e0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
133f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
13400 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
13430 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
13440 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
13450 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
13460 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
13470 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
13480 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72  tent */..  /* Tr
13490 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e  ue if opening an
134a0 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70   ephemeral, temp
134b0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a  orary database *
134c0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  /.  const int is
134d0 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61  TempDb = zFilena
134e0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
134f0 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  me[0]==0;..  /* 
13500 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
13510 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
13520 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
13530 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
13540 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
13550 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
13560 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  base..  */.#ifde
13570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
13580 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69  MORYDB.  const i
13590 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
135a0 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e  #else.  const in
135b0 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69  t isMemdb = (zFi
135c0 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70  lename && strcmp
135d0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
135e0 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20  mory:")==0).    
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20     || (isTempDb 
13610 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  && sqlite3TempIn
13620 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20  Memory(db)).    
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20     || (vfsFlags 
13650 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  & SQLITE_OPEN_ME
13660 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66  MORY)!=0;.#endif
13670 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
13680 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13690 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Vfs!=0 );.  asse
136a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
136b0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
136c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
136d0 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61  flags&0xff)==fla
136e0 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73  gs );   /* flags
136f0 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a   fit in 8 bits *
13700 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42  /..  /* Only a B
13710 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
13720 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45  base can be BTRE
13730 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20  E_UNORDERED */. 
13740 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
13750 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  & BTREE_UNORDERE
13760 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  D)==0 || (flags 
13770 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21  & BTREE_SINGLE)!
13780 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54  =0 );..  /* A BT
13790 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
137a0 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ase is always a 
137b0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72  temporary and/or
137c0 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20   ephemeral */.  
137d0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
137e0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d   BTREE_SINGLE)==
137f0 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b  0 || isTempDb );
13800 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20  ..  if( isMemdb 
13810 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
13820 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  BTREE_MEMORY;.  
13830 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67  }.  if( (vfsFlag
13840 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13850 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28  MAIN_DB)!=0 && (
13860 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d  isMemdb || isTem
13870 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46  pDb) ){.    vfsF
13880 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73  lags = (vfsFlags
13890 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
138a0 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54  MAIN_DB) | SQLIT
138b0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
138c0 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
138d0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
138e0 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
138f0 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
13900 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13910 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
13920 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
13930 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
13940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13950 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13960 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
13970 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
13980 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
13990 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
139a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
139b0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
139c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
139d0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
139e0 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
139f0 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
13a00 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
13a10 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
13a20 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
13a30 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
13a40 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
13a50 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
13a60 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
13a70 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
13a80 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
13a90 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
13aa0 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
13ab0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13ac0 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
13ad0 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
13ae0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
13af0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
13b00 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
13b10 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
13b20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13b30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
13b40 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
13b50 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
13b60 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
13b70 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
13b80 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13b90 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13ba0 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
13bb0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
13bc0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
13bd0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
13be0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13bf0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
13c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13c10 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
13c20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
13c40 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
13c50 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
13c60 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
13c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13c80 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
13c90 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
13ca0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
13cd0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
13ce0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13cf0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13d00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13d10 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13d20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
13d30 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13d40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13d50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13d60 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
13d70 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
13d80 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
13d90 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13da0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
13db0 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
13dc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13dd0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
13de0 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
13df0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
13e00 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13e10 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
13e20 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
13e30 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13e40 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
13e50 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
13e60 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
13e70 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13e80 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
13e90 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
13ea0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13eb0 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
13ec0 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
13ed0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
13ee0 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
13ef0 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
13f00 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
13f10 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
13f20 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
13f30 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
13f40 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
13f50 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
13f60 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
13f70 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
13f80 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
13f90 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
13fa0 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
13fb0 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
13fc0 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
13fd0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
13fe0 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
13ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14000 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14010 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14030 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14040 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
14050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14060 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
14070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14080 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
14090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
140a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
140b0 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
140c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
140d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
140e0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
140f0 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
14100 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
14110 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
14120 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14130 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14140 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14150 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14160 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
14170 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
14180 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
14190 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
141a0 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
141b0 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
141c0 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
141d0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
141e0 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
141f0 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
14200 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
14210 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
14220 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
14230 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
14240 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
14250 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
14260 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
14270 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
14280 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
14290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
142a0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
142b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
142c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
142d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
142e0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
142f0 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
14300 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
14310 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
14320 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
14330 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
14340 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
14350 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
14360 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
14370 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
14380 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
14390 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
143a0 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
143b0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
143c0 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
143d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
143e0 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
143f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
14400 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
14410 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
14420 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
14430 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
14440 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
14450 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
14460 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
14470 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
14480 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
14490 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
144a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
144b0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
144c0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
144d0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
144e0 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
144f0 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
14520 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
14530 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
14540 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
14560 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
14570 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
14580 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
14590 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
145a0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
145b0 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
145c0 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
145d0 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
145e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
145f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14600 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
14610 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
14620 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
14630 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
14640 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
14650 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
14660 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
14670 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
14680 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
14690 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
146a0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
146b0 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
146c0 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
146d0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
146e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
146f0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
14700 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
14710 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14720 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
14730 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
14740 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
14750 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14760 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
14770 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
14780 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
14790 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
147a0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
147b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
147c0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
147d0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
147e0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
147f0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
14800 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
14810 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
14820 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14830 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
14840 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
14850 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
14860 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
14870 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
14880 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
14890 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
148a0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
148b0 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
148c0 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
148d0 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
148e0 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
148f0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14900 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
14910 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14920 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
14930 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
14940 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
14950 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
14960 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
14970 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
14980 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
14990 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
149a0 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
149b0 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
149c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
149d0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
149e0 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
149f0 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
14a00 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
14a10 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
14a20 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
14a30 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
14a40 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
14a50 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
14a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14a70 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
14a80 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
14a90 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
14aa0 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
14ab0 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
14ac0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
14ad0 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
14ae0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
14af0 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
14b00 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
14b10 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
14b20 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
14b30 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
14b40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
14b50 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
14b60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14b70 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
14b80 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
14b90 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
14ba0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
14bb0 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
14bc0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
14bd0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
14be0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
14bf0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
14c00 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
14c10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14c20 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
14c30 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
14c40 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
14c50 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
14c60 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
14c70 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
14c80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14c90 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
14ca0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
14cb0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
14cc0 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
14cd0 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
14ce0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
14cf0 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
14d00 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
14d10 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
14d20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
14d30 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
14d40 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
14d50 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
14d60 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
14d70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
14d80 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
14d90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14da0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
14db0 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
14dc0 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
14dd0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
14de0 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
14df0 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
14e00 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
14e10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14e20 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14e30 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14e40 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14e50 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
14e60 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
14e70 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
14e80 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
14e90 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
14ea0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
14eb0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
14ec0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14ed0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
14ee0 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
14ef0 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
14f00 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
14f10 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d  C( mutexShared =
14f20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14f30 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14f40 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29  STATIC_MASTER);)
14f50 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
14f60 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
14f70 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14f80 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
14f90 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
14fa0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
14fb0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14fc0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
14fd0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
14fe0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
14ff0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15000 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
15010 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
15020 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
15030 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
15040 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
15050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
15060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
15070 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
15080 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
15090 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
150a0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
150b0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
150c0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
150d0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
150e0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
150f0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
15100 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
15110 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
15120 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
15130 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15140 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
15150 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
15160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
15170 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
15180 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
15190 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
151a0 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
151b0 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
151c0 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
151d0 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
151e0 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
151f0 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
15200 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
15210 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
15220 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
15230 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
15240 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
15250 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
15260 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
15270 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
15280 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
15290 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
152a0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
152b0 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
152c0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
152d0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
152e0 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
152f0 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
15300 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
15310 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
15320 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
15330 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
15340 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
15350 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
15360 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
15370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15380 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
15390 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
153a0 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
153b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
153c0 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
153d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
153e0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
153f0 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
15400 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
15410 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
15420 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
15430 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
15440 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
15450 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
15460 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
15470 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
15480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15490 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
154a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
154b0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
154c0 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
154d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
154e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
154f0 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
15500 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
15510 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
15520 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
15530 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
15540 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
15550 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
15560 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
15570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
15580 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
15590 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
155a0 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
155b0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
155c0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
155d0 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
155e0 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
155f0 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
15600 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
15610 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
15620 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
15630 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
15640 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
15650 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
15660 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
15670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
15680 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
15690 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
156a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
156b0 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
156c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
156d0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
156e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
156f0 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
15700 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
15710 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
15720 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
15730 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15740 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
15750 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
15760 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
15770 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
15780 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
15790 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
157a0 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
157b0 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
157c0 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
157d0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
157e0 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
157f0 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
15800 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
15810 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
15820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
15830 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
15840 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
15850 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
15860 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15870 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
15880 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
15890 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
158a0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
158b0 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
158c0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
158d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
158e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
158f0 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
15900 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
15910 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
15920 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
15930 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
15940 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15950 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
15960 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
15970 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
15980 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
15990 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
159a0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
159b0 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
159c0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
159d0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
159e0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
159f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
15a00 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
15a10 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
15a20 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
15a30 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
15a40 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
15a50 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
15a60 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
15a70 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
15a80 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
15a90 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
15aa0 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
15ab0 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
15ac0 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
15ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15ae0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
15af0 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
15b00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
15b10 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
15b20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
15b30 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
15b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15b50 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
15b60 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
15b70 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
15b80 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15b90 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
15ba0 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
15bb0 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
15bc0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
15bd0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
15be0 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
15bf0 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
15c00 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
15c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15c20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
15c30 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
15c40 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
15c50 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
15c60 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
15c70 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
15c80 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
15c90 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
15ca0 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
15cb0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
15cc0 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
15cd0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
15ce0 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
15cf0 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
15d00 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
15d10 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
15d20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
15d30 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
15d40 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
15d50 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
15d60 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
15d70 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
15d80 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
15d90 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
15da0 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
15db0 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
15dc0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
15dd0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
15de0 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
15df0 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
15e00 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
15e10 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
15e20 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
15e30 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
15e40 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15e50 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
15e60 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
15e70 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
15e80 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
15e90 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
15ea0 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
15eb0 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
15ec0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
15ed0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
15ee0 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
15ef0 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
15f00 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
15f10 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
15f20 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
15f30 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
15f40 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
15f50 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
15f60 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
15f70 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
15f80 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
15f90 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
15fa0 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
15fb0 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
15fc0 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
15fd0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
15fe0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15ff0 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
16000 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
16010 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
16020 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
16030 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
16040 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16050 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
16060 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
16070 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
16080 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
16090 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
160a0 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
160b0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
160c0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
160d0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
160e0 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
160f0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
16100 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
16110 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
16120 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
16130 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
16140 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
16150 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
16160 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
16170 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
16180 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
16190 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
161a0 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
161b0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
161c0 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
161d0 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
161e0 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
161f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16200 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
16210 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
16220 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16230 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
16240 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
16250 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
16260 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
16270 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
16280 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
16290 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
162a0 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
162b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
162c0 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
162d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
162e0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
162f0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
16300 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
16310 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
16320 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
16330 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
16340 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
16350 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
16360 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
16370 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
16380 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
16390 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
163a0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
163b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
163c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
163d0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
163e0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
163f0 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
16400 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
16410 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
16420 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
16430 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
16440 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
16450 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
16460 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
16470 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
16480 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
16490 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
164a0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
164b0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
164c0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
164d0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
164e0 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
164f0 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
16500 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
16510 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
16520 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
16530 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
16540 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
16550 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
16560 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
16570 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
16580 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
16590 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
165a0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
165b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
165c0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
165d0 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
165e0 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
165f0 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
16600 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
16610 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16620 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
16630 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
16640 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
16650 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
16660 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
16670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16680 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
16690 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
166a0 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
166b0 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
166c0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
166d0 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
166e0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
166f0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
16700 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
16710 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
16720 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
16730 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
16740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16750 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
16760 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
16770 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
16780 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
16790 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
167a0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
167b0 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
167c0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
167d0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
167e0 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
167f0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
16800 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
16810 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
16820 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
16830 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
16840 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
16850 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
16860 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
16870 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
16880 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
16890 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
168a0 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
168b0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
168c0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
168d0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
168e0 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
168f0 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
16900 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
16910 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
16920 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
16930 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
16940 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
16950 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
16960 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
16970 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
16980 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
16990 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
169a0 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
169b0 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
169c0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
169d0 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
169e0 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
169f0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
16a00 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
16a10 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
16a20 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
16a30 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
16a40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16a50 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16a60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16a70 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
16a80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16a90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
16aa0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
16ab0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
16ac0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
16ad0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16ae0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16af0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
16b00 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16b10 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
16b20 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
16b30 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
16b40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16b50 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
16b60 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
16b70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16b80 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
16b90 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
16ba0 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
16bb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16bc0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16bd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16be0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16bf0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16c00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16c10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16c20 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
16c30 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
16c40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16c50 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
16c70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16c80 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
16c90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
16ca0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
16cb0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
16cc0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
16cd0 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
16ce0 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
16cf0 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
16d00 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
16d10 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
16d20 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
16d30 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
16d40 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
16d50 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
16d60 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
16d70 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
16d80 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
16d90 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
16da0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
16db0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
16dc0 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
16dd0 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
16de0 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
16df0 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
16e00 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
16e10 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
16e20 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
16e30 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
16e40 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
16e50 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16e60 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
16e70 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
16e80 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
16e90 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16eb0 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
16ec0 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
16ed0 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
16ee0 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
16ef0 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
16f00 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
16f10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16f20 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16f30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16f40 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16f50 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16f60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16f70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16f80 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
16f90 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
16fa0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16fb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16fc0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16fd0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
16fe0 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
16ff0 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
17000 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
17010 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
17020 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
17030 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
17040 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
17050 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
17060 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
17070 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
17080 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
17090 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
170a0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
170b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
170c0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
170d0 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
170e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
170f0 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
17100 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
17110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17120 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
17130 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
17140 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17160 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17170 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
17180 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
17190 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
171a0 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
171b0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
171c0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
171d0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
171e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
171f0 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
17200 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
17210 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
17220 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
17230 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
17240 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
17250 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
17260 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
17270 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
17280 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
17290 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
172a0 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
172b0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
172c0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
172d0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
172e0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
172f0 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
17300 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
17310 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
17320 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
17330 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
17340 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
17350 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
17360 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
17370 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
17380 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
17390 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
173a0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
173b0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
173c0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
173d0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
173e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
173f0 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
17400 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
17410 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
17420 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
17430 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
17440 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
17450 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
17460 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
17470 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
17480 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
17490 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
174a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
174b0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
174c0 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
174d0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
174e0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
174f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17500 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
17510 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
17520 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
17530 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
17540 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
17550 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
17560 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
17570 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
17580 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
17590 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
175a0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
175b0 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
175c0 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
175d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
175e0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
175f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17600 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
17610 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17620 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
17630 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
17640 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
17650 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
17660 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
17670 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
17680 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
17690 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
176a0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
176b0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
176c0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
176d0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
176e0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
176f0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
17700 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
17710 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
17720 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
17730 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
17740 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
17750 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
17760 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
17770 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
17780 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
17790 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
177a0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
177b0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
177c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
177d0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
177e0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
177f0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
17800 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17810 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
17820 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
17830 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17840 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17850 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
17860 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
17870 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
17880 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
17890 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
178a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
178b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
178c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
178d0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
178e0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
178f0 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
17900 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
17910 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
17920 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
17930 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
17940 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
17950 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
17960 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
17970 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
17980 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
17990 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
179a0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
179b0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
179c0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
179d0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
179e0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
179f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
17a00 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
17a10 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
17a20 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
17a30 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
17a40 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
17a50 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
17a60 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
17a70 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
17a80 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
17a90 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
17aa0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
17ab0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
17ac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17ad0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
17ae0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
17af0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
17b00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17b10 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
17b20 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
17b30 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
17b40 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
17b50 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
17b60 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
17b70 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17b80 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
17b90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
17ba0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
17bb0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
17bc0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
17bd0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
17be0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
17bf0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
17c00 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
17c10 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
17c20 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
17c30 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
17c40 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
17c50 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
17c60 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
17c70 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
17c80 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
17c90 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
17ca0 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
17cb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17cc0 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
17cd0 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
17ce0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
17cf0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17d00 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
17d10 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
17d20 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
17d30 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
17d40 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
17d50 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
17d60 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
17d70 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
17d80 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
17d90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17da0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
17db0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
17dc0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
17dd0 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
17de0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
17df0 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
17e00 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
17e10 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
17e20 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
17e30 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
17e40 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
17e50 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
17e60 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
17e70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
17e80 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
17e90 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17ea0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
17eb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17ec0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
17ed0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
17ee0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
17ef0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
17f00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
17f20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17f30 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17f40 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
17f50 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
17f60 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
17f70 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
17f80 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
17f90 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
17fa0 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
17fb0 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
17fc0 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
17fd0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
17fe0 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
17ff0 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
18000 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
18010 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
18020 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18030 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18040 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
18050 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
18060 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
18070 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
18080 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
18090 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
180a0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
180b0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
180c0 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
180d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
180e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
180f0 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
18100 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18110 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
18120 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
18130 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
18140 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
18150 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
18160 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
18170 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
18180 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
18190 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
181a0 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
181b0 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
181c0 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
181d0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
181e0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
181f0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
18200 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
18210 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
18220 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
18230 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
18240 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
18250 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
18260 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
18270 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18280 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
18290 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
182a0 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
182b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
182c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
182d0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
182e0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
182f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18300 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
18310 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
18320 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
18330 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
18340 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
18350 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
18360 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18380 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
18390 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
183a0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
183b0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
183c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
183d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
183e0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
183f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18400 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
18410 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
18420 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
18430 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
18440 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
18450 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
18460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18470 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
18480 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
18490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
184a0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
184b0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
184c0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
184d0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
184e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
184f0 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
18500 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
18510 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
18520 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
18530 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
18540 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
18550 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
18560 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
18570 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
18580 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18590 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
185a0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
185b0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
185c0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
185d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
185e0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
185f0 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
18600 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
18610 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
18620 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18630 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
18640 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
18650 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
18660 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
18670 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
18680 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
18690 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
186a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
186b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
186c0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
186d0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
186e0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
186f0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
18700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
18710 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
18720 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18740 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
18750 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
18760 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
18770 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
18780 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
18790 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
187a0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
187b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
187c0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
187d0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
187e0 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
187f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
18800 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
18810 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
18820 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
18830 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
18840 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
18850 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
18860 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
18870 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18880 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
18890 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
188a0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
188b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
188c0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
188d0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
188e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
188f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
18900 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
18910 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
18920 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
18930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18940 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
18950 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
18960 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
18970 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
18980 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
18990 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
189a0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
189b0 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
189c0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
189d0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
189e0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
189f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
18a00 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
18a10 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
18a20 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
18a30 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
18a40 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
18a50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
18a60 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
18a70 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
18a80 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
18a90 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
18aa0 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
18ab0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
18ac0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
18ad0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
18ae0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
18af0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18b00 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
18b10 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
18b20 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
18b30 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
18b40 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
18b50 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
18b60 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
18b70 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
18b80 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
18b90 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
18ba0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
18bb0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
18bc0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
18bd0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18be0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18bf0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
18c00 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
18c10 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
18c20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
18c30 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
18c40 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
18c50 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
18c60 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
18c70 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18c80 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
18c90 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
18ca0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
18cb0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18cc0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
18cd0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
18ce0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
18cf0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18d00 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
18d10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
18d20 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
18d30 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
18d40 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
18d50 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
18d60 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
18d70 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
18d80 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
18d90 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
18da0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
18db0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
18dc0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
18dd0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
18de0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
18df0 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
18e00 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
18e10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
18e20 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
18e30 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
18e40 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
18e50 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
18e60 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
18e70 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
18e80 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
18e90 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
18ea0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
18eb0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
18ec0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
18ed0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
18ee0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
18ef0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
18f00 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
18f10 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
18f20 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
18f30 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
18f40 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
18f50 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
18f60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18f70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18f80 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18f90 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
18fa0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
18fb0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
18fc0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
18fd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
18fe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
18ff0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19000 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
19010 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
19020 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
19030 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
19040 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
19050 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
19060 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
19070 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
19080 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
19090 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
190a0 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
190b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
190c0 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
190d0 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
190e0 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
190f0 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
19100 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
19110 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
19120 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
19130 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
19140 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
19150 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
19160 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
19170 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19180 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19190 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
191a0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
191b0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
191c0 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
191d0 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
191e0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
191f0 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
19200 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
19210 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
19220 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
19230 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
19240 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
19250 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
19260 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
19270 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
19280 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19290 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
192a0 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
192b0 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
192c0 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
192d0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
192e0 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
192f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
19300 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
19310 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
19320 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
19330 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
19340 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
19350 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
19360 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19370 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19380 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
19390 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
193a0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
193b0 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
193c0 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
193d0 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
193e0 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
193f0 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
19400 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
19410 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
19420 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
19430 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
19440 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
19450 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
19460 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
19470 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
19480 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
19490 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
194a0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
194b0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
194c0 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
194d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
194e0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
194f0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
19500 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
19510 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
19520 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
19530 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
19540 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
19550 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
19560 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
19570 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
19580 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
19590 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
195a0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
195b0 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
195c0 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
195d0 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
195e0 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
195f0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
19600 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
19610 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
19620 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
19630 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
19640 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
19650 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
19660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
19670 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
19680 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
19690 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
196a0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
196b0 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
196c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
196d0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
196e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
196f0 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
19700 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
19710 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19720 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
19730 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
19740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19750 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
19760 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
19770 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
197b0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
197c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
197d0 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d     if( (pBt->db-
197e0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
197f0 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30  RecoveryMode)==0
19800 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
19810 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
19820 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
19830 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
19840 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
19850 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
19860 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19870 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
19880 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
19890 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
198a0 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
198b0 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
198c0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
198d0 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
198e0 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
198f0 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
19900 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
19910 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
19920 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
19930 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
19940 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19950 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19960 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
19970 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
19980 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
19990 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
199a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
199b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
199c0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
199d0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
199e0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
199f0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
19a00 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
19a10 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
19a20 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
19a30 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
19a40 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
19a50 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
19a60 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
19a70 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
19a80 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
19a90 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
19aa0 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
19ab0 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
19ac0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
19ad0 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
19ae0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
19af0 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
19b00 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
19b10 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
19b20 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
19b30 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
19b40 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
19b50 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
19b60 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
19b70 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
19b80 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
19b90 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
19ba0 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
19bb0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
19bc0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
19bd0 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
19be0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
19bf0 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
19c00 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
19c10 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
19c20 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
19c30 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
19c40 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
19c50 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
19c60 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
19c70 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
19c80 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
19c90 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
19ca0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19cb0 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
19cc0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
19cd0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
19ce0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
19cf0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
19d00 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
19d10 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
19d20 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
19d30 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
19d40 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
19d50 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
19d60 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
19d70 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
19d80 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
19d90 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
19da0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
19db0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
19dc0 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
19dd0 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
19de0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
19df0 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
19e00 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
19e10 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
19e20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
19e30 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
19e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e50 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
19e60 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
19e70 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
19e80 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
19e90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19ea0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
19eb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19ec0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
19ed0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e  ors open on pBt.
19ee0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
19ef0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
19f00 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
19f10 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
19f20 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
19f30 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
19f40 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  .**.** Only writ
19f50 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  e cursors are co
19f60 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20  unted if wrOnly 
19f70 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f  is true.  If wrO
19f80 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20  nly is.** false 
19f90 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  then all cursors
19fa0 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a   are counted..**
19fb0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
19fc0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
19fd0 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69  tine, a cursor i
19fe0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
19ff0 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
1a000 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  of reading or wr
1a010 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
1a020 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20  abase.  Cursors 
1a030 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  that.** have bee
1a040 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74  n tripped into t
1a050 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  he CURSOR_FAULT 
1a060 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f  state are not co
1a070 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  unted..*/.static
1a080 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43   int countValidC
1a090 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
1a0a0 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79  *pBt, int wrOnly
1a0b0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1a0c0 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
1a0d0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
1a0e0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
1a0f0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
1a100 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f  t){.    if( (wrO
1a110 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nly==0 || (pCur-
1a120 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
1a130 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a  _WriteFlag)!=0).
1a140 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53       && pCur->eS
1a150 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
1a160 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
1a170 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
1a180 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
1a190 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
1a1a0 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
1a1b0 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
1a1c0 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
1a1d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1a1e0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
1a1f0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1a200 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
1a210 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
1a220 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
1a230 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1a240 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
1a250 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
1a260 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
1a270 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1a280 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
1a290 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1a2a0 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
1a2b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1a2c0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1a2d0 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
1a2e0 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
1a2f0 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
1a300 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a310 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1a320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f   );.  assert( co
1a330 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1a340 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74  pBt,0)==0 || pBt
1a350 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
1a360 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
1a370 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
1a380 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1a390 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
1a3a0 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50  1!=0 ){.    MemP
1a3b0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1a3c0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61  t->pPage1;.    a
1a3d0 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61  ssert( pPage1->a
1a3e0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
1a3f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1a400 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
1a410 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
1a420 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
1a430 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1a440 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b  NotNull(pPage1);
1a450 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
1a460 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
1a470 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
1a480 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
1a490 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
1a4a0 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
1a4b0 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
1a4c0 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
1a4d0 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
1a4e0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1a4f0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
1a500 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
1a510 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
1a520 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
1a530 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
1a540 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1a550 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a560 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1a570 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1a580 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
1a590 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a5a0 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
1a5b0 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
1a5c0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
1a5d0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
1a5e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a5f0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
1a600 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1a610 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1a620 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
1a630 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
1a640 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
1a650 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
1a660 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1a670 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
1a680 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
1a690 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
1a6a0 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
1a6b0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
1a6c0 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
1a6d0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
1a6e0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
1a6f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a700 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
1a710 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
1a720 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
1a730 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
1a740 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
1a750 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
1a760 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
1a770 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
1a780 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
1a790 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
1a7a0 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
1a7b0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
1a7c0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
1a7d0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
1a7e0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
1a7f0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
1a800 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1a810 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
1a820 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
1a830 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a840 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
1a850 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
1a860 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
1a870 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
1a880 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
1a890 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
1a8a0 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
1a8b0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1a8c0 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
1a8d0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
1a8e0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
1a8f0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
1a900 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
1a910 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
1a920 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
1a930 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
1a940 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1a950 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1a960 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1a970 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a980 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
1a990 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
1a9a0 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
1a9b0 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
1a9c0 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
1a9d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1a9e0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
1a9f0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
1aa00 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
1aa10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1aa20 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
1aa30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1aa40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1aa50 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
1aa60 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
1aa70 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1aa80 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
1aa90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1aaa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1aab0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1aac0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
1aad0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
1aae0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
1aaf0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
1ab00 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1ab10 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
1ab20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
1ab30 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
1ab40 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
1ab50 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
1ab60 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
1ab70 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
1ab80 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
1ab90 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
1aba0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1abb0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
1abc0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
1abd0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
1abe0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
1abf0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
1ac00 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
1ac10 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
1ac20 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
1ac30 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
1ac40 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
1ac50 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
1ac60 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
1ac70 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
1ac80 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1ac90 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
1aca0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
1acb0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
1acc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1acd0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
1ace0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1acf0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
1ad00 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
1ad10 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1ad20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
1ad30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1ad40 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
1ad50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ad60 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
1ad70 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1ad80 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
1ad90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1ada0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
1adb0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1adc0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
1add0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ade0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
1adf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
1ae00 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
1ae10 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
1ae20 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
1ae30 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
1ae40 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
1ae50 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
1ae60 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
1ae70 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
1ae80 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
1ae90 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1aea0 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
1aeb0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
1aec0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
1aed0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
1aee0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
1aef0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1af00 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
1af10 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
1af20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1af30 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
1af40 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
1af50 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
1af60 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1af70 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
1af80 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
1af90 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
1afa0 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
1afb0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
1afc0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
1afd0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
1afe0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
1aff0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
1b000 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
1b010 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
1b020 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
1b030 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1b040 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
1b050 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
1b060 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
1b070 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
1b080 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
1b090 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
1b0a0 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
1b0b0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
1b0c0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
1b0d0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
1b0e0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1b0f0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
1b100 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
1b110 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
1b120 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
1b130 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
1b140 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
1b150 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1b160 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
1b170 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
1b180 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1b190 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1b1a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1b1b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b1c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1b1d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1b1e0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b1f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
1b200 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
1b210 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1b220 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
1b230 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1b240 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1b250 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
1b260 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
1b270 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
1b280 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1b290 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1b2a0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1b2b0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
1b2c0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
1b2d0 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
1b2e0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1b2f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1b300 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b310 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1b320 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
1b330 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
1b340 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
1b350 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
1b360 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
1b370 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
1b380 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
1b390 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1b3a0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1b3b0 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
1b3c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b3d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
1b3e0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1b3f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1b400 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1b410 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e  CACHE.  /* If an
1b420 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1b430 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1b440 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1b450 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1b460 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1b470 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1b480 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1b490 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b4a0 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
1b4b0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
1b4c0 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20  E_LOCKED..  */. 
1b4d0 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1b4e0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b4f0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1b500 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  .   || (pBt->bts
1b510 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
1b520 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ING)!=0.  ){.   
1b530 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
1b540 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
1b550 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1b560 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
1b570 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
1b580 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1b590 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1b5a0 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1b5b0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
1b5c0 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
1b5d0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1b5e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1b5f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b600 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b610 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1b620 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
1b630 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
1b640 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
1b650 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
1b660 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
1b670 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1b680 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
1b690 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
1b6a0 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
1b6b0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1b6c0 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
1b6d0 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
1b6e0 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
1b6f0 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
1b700 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
1b710 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
1b720 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
1b730 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
1b740 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
1b750 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
1b760 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
1b770 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
1b780 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
1b790 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
1b7a0 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
1b7b0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
1b7c0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1b7d0 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
1b7e0 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
1b7f0 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
1b800 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1b810 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1b820 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
1b830 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
1b840 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
1b850 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
1b860 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
1b870 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
1b880 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1b890 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1b8a0 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
1b8b0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
1b8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
1b8d0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
1b8e0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
1b8f0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
1b900 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
1b910 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
1b920 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1b930 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
1b940 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
1b950 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
1b960 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
1b970 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
1b980 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
1b990 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
1b9a0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1b9b0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
1b9c0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
1b9d0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
1b9e0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
1b9f0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
1ba00 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
1ba10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ba20 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1ba30 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1ba40 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1ba50 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
1ba60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ba70 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
1ba80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1ba90 6e 74 20 65 78 46 6c 61 67 20 3d 20 28 70 2d 3e  nt exFlag = (p->
1baa0 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
1bab0 26 26 20 21 49 53 41 55 54 4f 56 41 43 55 55 4d  && !ISAUTOVACUUM
1bac0 29 20 3f 20 2d 31 20 3a 20 28 77 72 66 6c 61 67  ) ? -1 : (wrflag
1bad0 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  >1);.        int
1bae0 20 62 53 75 62 6a 49 6e 4d 65 6d 20 3d 20 73 71   bSubjInMem = sq
1baf0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
1bb00 79 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  y(p->db);.      
1bb10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
1bb20 3e 62 43 6f 6e 63 75 72 72 65 6e 74 3d 3d 30 20  >bConcurrent==0 
1bb30 7c 7c 20 77 72 66 6c 61 67 3d 3d 31 20 29 3b 0a  || wrflag==1 );.
1bb40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1bb50 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1bb60 42 74 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c  Bt->pPager, exFl
1bb70 61 67 2c 20 62 53 75 62 6a 49 6e 4d 65 6d 29 3b  ag, bSubjInMem);
1bb80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1bb90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bba0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
1bbb0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1bbc0 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
1bbd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
1bbe0 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 20 20 20  NCURRENT.       
1bbf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bc00 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 50 61 67  OK && sqlite3Pag
1bc10 65 72 49 73 43 6f 6e 63 75 72 72 65 6e 74 28 70  erIsConcurrent(p
1bc20 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1bc30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
1bc40 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74  reePtrmapAllocat
1bc50 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1bc60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
1bc70 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1bc80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bc90 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
1bca0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1bcb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
1bcc0 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
1bcd0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
1bce0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1bcf0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
1bd00 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
1bd10 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
1bd20 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
1bd30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bd40 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1bd50 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1bd60 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1bd70 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
1bd80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bd90 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1bda0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
1bdb0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
1bdc0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
1bdd0 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
1bde0 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
1bdf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1be00 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
1be10 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
1be20 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
1be30 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
1be40 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
1be50 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
1be60 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1be70 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
1be80 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
1be90 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
1bea0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1beb0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
1bec0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
1bed0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1bee0 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
1bef0 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1bf00 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
1bf10 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1bf20 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
1bf30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1bf40 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1bf50 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
1bf60 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
1bf70 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
1bf80 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
1bf90 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
1bfa0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1bfb0 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
1bfc0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1bfd0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
1bfe0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1bff0 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
1c000 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
1c010 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
1c020 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
1c030 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
1c040 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
1c050 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1c060 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
1c070 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
1c080 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
1c090 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
1c0a0 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
1c0b0 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
1c0c0 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
1c0d0 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
1c0e0 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
1c0f0 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
1c100 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
1c110 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
1c120 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
1c130 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
1c140 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1c150 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
1c160 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
1c170 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
1c180 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c190 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1c1a0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1c1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1c1c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c1d0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1c1e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1c1f0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1c200 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1c210 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c220 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
1c230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c240 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1c250 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
1c260 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
1c270 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
1c280 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
1c290 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
1c2a0 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
1c2b0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1c2c0 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
1c2d0 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
1c2e0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
1c2f0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
1c300 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
1c310 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
1c320 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
1c330 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d  int nSavepoint =
1c340 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1c350 6e 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  nt;.    rc = sql
1c360 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1c370 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1c380 65 72 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b  er, nSavepoint);
1c390 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c3a0 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70  ITE_OK && nSavep
1c3b0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  oint ){.      rc
1c3c0 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 42 65   = btreePtrmapBe
1c3d0 67 69 6e 28 70 42 74 2c 20 6e 53 61 76 65 70 6f  gin(pBt, nSavepo
1c3e0 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  int);.    }.  }.
1c3f0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1c400 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
1c410 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c420 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1c430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c440 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
1c450 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
1c460 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
1c470 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
1c480 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
1c490 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
1c4a0 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
1c4b0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1c4c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
1c4d0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
1c4e0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
1c4f0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1c500 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
1c510 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
1c520 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
1c530 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
1c540 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
1c570 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
1c580 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c5a0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
1c5b0 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
1c5c0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c5f0 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
1c600 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1c610 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
1c620 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1c630 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
1c640 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1c650 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1c660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c670 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1c680 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
1c690 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1c6a0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1c6b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
1c6c0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
1c6d0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
1c6e0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1c6f0 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
1c700 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1c710 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
1c720 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1c730 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
1c740 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
1c750 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
1c760 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1c770 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
1c780 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1c790 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
1c7a0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1c7b0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1c7c0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1c7d0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
1c7e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1c7f0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1c800 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1c810 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1c820 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1c830 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1c840 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1c850 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1c860 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1c870 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
1c880 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1c890 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
1c8a0 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1c8b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c8c0 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1c8d0 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1c8e0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1c8f0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1c900 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1c910 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1c920 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1c930 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1c940 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1c950 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1c960 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1c970 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1c980 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1c990 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1c9a0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1c9b0 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1c9c0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1c9d0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1c9e0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1c9f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1ca00 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1ca10 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1ca20 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1ca30 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1ca50 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1ca60 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1ca70 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1ca80 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ca90 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1caa0 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1cab0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1cac0 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1caf0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1cb00 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1cb10 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1cb20 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1cb30 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1cb40 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1cb50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cb60 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1cb70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1cb80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cb90 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1cba0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1cbb0 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1cbc0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1cbd0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1cbe0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1cbf0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1cc00 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1cc10 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1cc20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1cc30 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1cc40 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1cc50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cc60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1cc70 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1cc80 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1cc90 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1cca0 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
1ccb0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1ccc0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1ccd0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
1cce0 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20  int rc;..    rc 
1ccf0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1cd00 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1cd10 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1cd20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1cd30 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1cd40 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1cd50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1cd60 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1cd70 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1cd80 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1cd90 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1cda0 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1cdb0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1cdc0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1cdd0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1cde0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1cdf0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
1ce00 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20  low.         && 
1ce10 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
1ce20 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61  flow+3<=pPage->a
1ce30 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
1ce40 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26  Page.         &&
1ce50 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1ce60 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
1ce70 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20  erflow]).       
1ce80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1ce90 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
1cea0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
1ceb0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1cec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1ced0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cee0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1cef0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1cf00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1cf10 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1cf20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1cf30 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1cf40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1cf50 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1cf60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1cf70 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1cf80 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1cf90 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1cfa0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1cfb0 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1cfc0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1cfd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1cfe0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
1cff0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1d000 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1d010 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1d020 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
1d030 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
1d040 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1d050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d060 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1d070 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1d080 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1d090 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1d0a0 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1d0b0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1d0c0 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1d0d0 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1d0e0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1d0f0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1d100 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1d110 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1d120 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1d130 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1d140 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1d150 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1d160 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1d170 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1d180 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1d190 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1d1a0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1d1b0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1d1c0 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1d1d0 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1d1e0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1d1f0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1d200 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1d210 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1d220 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1d230 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1d240 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1d250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1d260 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1d270 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1d280 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1d290 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1d2a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1d2b0 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1d2c0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1d2d0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1d2e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1d2f0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1d300 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1d310 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1d320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1d330 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1d340 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1d350 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1d360 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1d370 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1d380 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1d390 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1d3a0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1d3b0 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1d3c0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1d3d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1d3e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1d3f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1d400 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1d410 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1d420 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1d430 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1d440 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1d450 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1d460 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1d470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d480 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d490 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d4a0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1d4b0 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1d4c0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1d4d0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1d4e0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1d4f0 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1d500 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1d510 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1d520 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1d530 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1d540 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1d550 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1d560 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1d570 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1d580 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d590 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1d5a0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1d5b0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1d5c0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1d5d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d5e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d5f0 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1d600 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1d610 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1d620 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1d630 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1d640 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1d650 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1d660 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1d670 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1d680 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1d690 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1d6a0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1d6b0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1d6c0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1d6d0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1d6e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1d6f0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1d700 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1d710 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1d720 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1d730 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1d740 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1d750 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1d760 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1d770 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1d780 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1d790 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1d7a0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1d7b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1d7c0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1d7d0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d7e0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1d7f0 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1d800 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d830 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d840 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1d850 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1d860 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1d870 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1d880 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1d890 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1d8a0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d8b0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1d8c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d8d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d8e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d900 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1d910 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1d920 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1d930 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1d940 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1d950 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1d960 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1d970 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1d980 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1d990 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1d9a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d9b0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1d9c0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1d9d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1d9e0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1d9f0 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1da00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1da10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1da20 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1da30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1da40 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1da50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1da60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1da70 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1da80 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1da90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1daa0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1dab0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1dac0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1dad0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1dae0 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1daf0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1db00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1db10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1db20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1db30 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1db40 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1db50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1db60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1db70 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1db80 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1db90 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1dba0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1dbb0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1dbc0 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1dbd0 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1dbe0 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1dbf0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1dc00 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1dc10 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1dc20 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1dc30 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1dc40 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1dc50 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1dc60 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1dc70 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1dc80 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1dc90 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1dca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1dcb0 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1dcc0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1dcd0 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1dce0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1dcf0 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1dd00 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1dd10 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1dd20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1dd30 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1dd40 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1dd50 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1dd60 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1dd70 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1dd80 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1dd90 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1dda0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ddb0 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1ddc0 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1ddd0 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1dde0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1ddf0 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1de00 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1de10 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1de20 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1de30 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1de40 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1de50 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1de60 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1de70 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1de80 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1de90 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1dea0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1deb0 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1dec0 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1ded0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1dee0 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1def0 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1df00 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1df10 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1df20 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1df30 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1df40 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1df50 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1df60 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1df70 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1df80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1df90 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1dfa0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1dfb0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1dfc0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1dfd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1dfe0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1dff0 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1e000 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1e010 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1e020 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1e030 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1e040 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e050 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1e060 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1e070 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1e080 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1e090 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e0a0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1e0b0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1e0c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e0d0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1e0e0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1e0f0 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1e100 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1e110 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1e120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e130 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1e150 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1e160 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1e170 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e180 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1e190 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1e1a0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1e1b0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1e1c0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1e1d0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1e1e0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1e1f0 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1e200 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1e210 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1e220 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1e230 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1e240 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1e250 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1e260 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1e270 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1e280 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1e290 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1e2a0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1e2b0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1e2c0 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1e2d0 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1e2e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e2f0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1e300 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1e310 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1e320 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1e330 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1e340 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1e350 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1e360 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1e370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e3a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e3b0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e3c0 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1e3d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e3e0 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1e3f0 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1e400 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1e410 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1e420 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1e430 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1e440 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1e450 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1e460 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1e470 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1e480 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1e490 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1e4a0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1e4b0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1e4c0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1e4d0 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1e4e0 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1e4f0 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1e500 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1e510 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1e520 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1e530 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1e540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e560 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1e570 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1e580 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1e590 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1e5a0 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1e5b0 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1e5c0 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1e5d0 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1e5e0 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1e5f0 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1e600 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1e610 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1e620 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1e630 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1e640 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1e650 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1e660 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1e670 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1e680 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1e690 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1e6a0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1e6b0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1e6c0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1e6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1e6e0 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1e6f0 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1e700 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1e710 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1e720 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1e730 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1e740 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1e750 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1e760 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1e770 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1e780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e7a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1e7b0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1e7c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1e7e0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1e7f0 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1e800 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1e810 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1e820 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1e830 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1e840 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1e850 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1e860 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1e870 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1e880 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1e890 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e8a0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1e8b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e8c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1e8d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1e8e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e8f0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1e900 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1e910 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1e920 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1e930 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e940 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1e950 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1e960 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1e970 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1e980 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1e990 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1e9a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e9b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1e9c0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1e9d0 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1e9e0 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1e9f0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1ea00 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1ea10 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1ea20 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1ea30 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1ea40 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1ea50 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1ea60 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1ea70 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1ea80 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1ea90 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1eaa0 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1eab0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1eac0 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1ead0 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1eb00 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1eb10 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1eb20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1eb50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1eb60 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1eb70 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb90 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1eba0 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1ebb0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1ebc0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1ebd0 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1ebe0 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1ebf0 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1ec00 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1ec10 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1ec20 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1ec30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ec40 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1ec50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ec60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1ec70 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1ec80 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1ec90 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1eca0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1ecb0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ecc0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1ecd0 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1ece0 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1ecf0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1ed00 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1ed10 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1ed20 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1ed30 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1ed40 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1ed50 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1ed60 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1ed70 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1ed80 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1ed90 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1eda0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1edb0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1edc0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1edd0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1ede0 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1edf0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1ee00 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ee10 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1ee20 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1ee30 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1ee40 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1ee50 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1ee60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1ee70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ee80 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1ee90 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1eea0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1eeb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1eec0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1eed0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1eee0 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1eef0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ef00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ef10 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1ef20 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1ef30 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1ef40 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1ef50 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1ef60 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1ef70 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1ef80 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1ef90 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1efa0 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1efb0 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1efc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1efd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1efe0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1eff0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1f000 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1f010 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1f020 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1f030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f040 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1f050 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1f060 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1f070 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1f080 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1f090 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1f0a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f0b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f0c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f0d0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1f0e0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f0f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f100 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f110 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1f120 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1f130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f140 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1f150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1f160 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f170 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1f180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1f190 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1f1a0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1f1b0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1f1c0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1f1d0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1f1e0 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1f1f0 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1f200 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1f210 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1f220 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1f230 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1f240 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1f250 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1f260 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1f270 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1f280 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1f290 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1f2a0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1f2b0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1f2c0 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1f2d0 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1f2e0 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1f2f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1f300 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1f310 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1f320 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f330 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1f340 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1f350 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1f360 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1f370 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1f380 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
1f390 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f3a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1f3b0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1f3c0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1f3d0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1f3e0 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1f3f0 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1f400 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1f410 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1f420 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f430 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1f440 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1f450 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1f460 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1f470 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f480 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1f490 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1f4a0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1f4b0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1f4c0 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1f4d0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1f4e0 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1f4f0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1f500 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1f510 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1f520 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1f530 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1f540 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f550 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1f560 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1f570 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1f580 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1f590 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1f5a0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1f5b0 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1f5c0 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1f5d0 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1f5e0 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1f5f0 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1f600 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1f610 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1f620 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1f630 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1f640 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f660 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f670 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1f680 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1f690 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f6a0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1f6b0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1f6c0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1f6d0 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1f6e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f6f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f700 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1f710 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1f720 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1f730 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1f740 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1f750 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1f760 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1f770 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1f780 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1f790 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1f7a0 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1f7b0 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1f7c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1f7d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1f7e0 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1f7f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f800 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1f810 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f820 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f830 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f840 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1f850 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f860 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1f870 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1f880 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f890 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1f8a0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1f8b0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1f8c0 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1f8d0 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1f8e0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1f8f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f900 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1f910 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1f920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1f930 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1f940 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1f950 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1f960 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1f970 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1f980 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f990 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1f9a0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1f9b0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1f9c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f9d0 45 4e 41 42 4c 45 5f 43 4f 4e 43 55 52 52 45 4e  ENABLE_CONCURREN
1f9e0 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  T./*.** This fun
1f9f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1fa00 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72 67 69  as part of mergi
1fa10 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54  ng an CONCURRENT
1fa20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74   transaction wit
1fa30 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73 68 6f  h.** the snapsho
1fa40 74 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66  t at the head of
1fa50 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e 20 49   the wal file. I
1fa60 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c 6c 20  t relocates all 
1fa70 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pages in the.** 
1fa80 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e 69 4c  range iFirst..iL
1fa90 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
1faa0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1fab0 61 74 20 74 68 65 20 42 74 72 65 65 50 74 72 6d  at the BtreePtrm
1fac0 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ap .** structure
1fad0 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4d 61   at BtShared.pMa
1fae0 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  p contains the l
1faf0 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ocation of the p
1fb00 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63 68 0a  ointers to each.
1fb10 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 72  ** page in the r
1fb20 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ange..**.** If p
1fb30 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55 4c 4c  nCurrent is NULL
1fb40 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
1fb50 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 61 72   in the range ar
1fb60 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72 72 65  e moved to curre
1fb70 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c 6f 63  ntly.** free loc
1fb80 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66 72 65  ations (i.e. fre
1fb90 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29 20  e-list entries) 
1fba0 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62  within the datab
1fbb0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
1fbc0 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74 2e 0a  page.** iFirst..
1fbd0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70 6e 43  **.** Or, if pnC
1fbe0 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  urrent is not NU
1fbf0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e  LL, then it poin
1fc00 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20 63 6f  ts to a value co
1fc10 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ntaining the.** 
1fc20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
1fc30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fc40 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e 20 74  e in pages. In t
1fc50 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20 70 61  his case, all pa
1fc60 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c 6f 63  ges are.** reloc
1fc70 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20  ated to the end 
1fc80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1fc90 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46 69 72  file - page iFir
1fca0 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  st is relocated 
1fcb0 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70 6e 43  to.** page (*pnC
1fcc0 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67 65 20  urrent+1), page 
1fcd0 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61 67 65  iFirst+1 to page
1fce0 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32 29 2c   (*pnCurrent+2),
1fcf0 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 56   and so on..** V
1fd00 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e 74 20  alue *pnCurrent 
1fd10 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 65  is set to the ne
1fd20 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  w size of the da
1fd30 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
1fd40 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
1fd50 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
1fd60 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1fd70 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
1fd80 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1fd90 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
1fda0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1fdb0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
1fdc0 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20 20 42  locateRange(.  B
1fdd0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fdf0 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  * B-tree handle 
1fe00 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74  */.  Pgno iFirst
1fe10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fe20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1fe30 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
1fe40 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 2c 20  /.  Pgno iLast, 
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65      /* Last page
1fe70 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a   to relocate */.
1fe80 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72 65 6e    Pgno *pnCurren
1fe90 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1fea0 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
1feb0 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61 62 61  , IN/OUT: Databa
1fec0 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  se size */.){.  
1fed0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fee0 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  OK;.  BtreePtrma
1fef0 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
1ff00 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50 67 3b  Map;.  Pgno iPg;
1ff10 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46 69 72  ..  for(iPg=iFir
1ff20 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20 26  st; iPg<=iLast &
1ff30 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1ff40 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d   iPg++){.    Mem
1ff50 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20 30 3b  Page *pFree = 0;
1ff60 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61 6c 6c       /* Page all
1ff70 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72 65 65  ocated from free
1ff80 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d 65 6d  -list */.    Mem
1ff90 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
1ffa0 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20 20 20     Pgno iNew;   
1ffb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1ffc0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  w page number fo
1ffd0 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50 74 72  r pPg */.    Ptr
1ffe0 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  mapEntry *pEntry
1fff0 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
20000 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
20010 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20 20 69  ge iPg */..    i
20020 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  f( iPg==PENDING_
20030 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20040 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
20050 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61  Entry = &pMap->a
20060 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70 2d 3e  Ptr[iPg - pMap->
20070 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20 69 66  iFirst];..    if
20080 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d  ( pEntry->eType=
20090 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
200a0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 64   ){.      Pgno d
200b0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  ummy;.      rc =
200c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
200d0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20  ge(pBt, &pFree, 
200e0 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42 54 41  &dummy, iPg, BTA
200f0 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
20100 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20110 46 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Free);.      ass
20120 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20130 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67  OK || dummy==iPg
20140 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
20150 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20  ( pnCurrent ){. 
20160 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
20170 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
20180 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
20190 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
201a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 67 2d  Iswriteable(pPg-
201b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
201c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
201d0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
201e0 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67 65  unt(pPg->pDbPage
201f0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4e  )==1 );.      iN
20200 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
20210 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nt);.      if( i
20220 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  New==PENDING_BYT
20230 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 69 4e  E_PAGE(pBt) ) iN
20240 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
20250 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
20260 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
20270 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65  , pPg, pEntry->e
20280 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61  Type, pEntry->pa
20290 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a  rent, iNew, 1);.
202a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
202b0 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  eNotNull(pPg);. 
202c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
202d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
202e0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
202f0 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72 73  ee, &iNew, iFirs
20300 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29  t-1, BTALLOC_LE)
20310 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20320 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
20330 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b 0a   iNew<iFirst );.
20340 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20360 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
20370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  = 0;.        rel
20380 65 61 73 65 50 61 67 65 28 70 46 72 65 65 29 3b  easePage(pFree);
20390 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 47 65  .        btreeGe
203a0 74 50 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20  tPage(pBt, iPg, 
203b0 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
203c0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
203d0 61 67 65 28 70 42 74 2c 20 70 50 67 2c 20 70 45  age(pBt, pPg, pE
203e0 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e  ntry->eType, pEn
203f0 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69 4e 65 77  try->parent,iNew
20400 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ,1);.        rel
20410 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
20420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20430 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20440 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 2d 74 72 65  ./*.** The b-tre
20450 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
20460 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
20470 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
20480 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a 2a 20 43 4f   commit an.** CO
20490 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63  NCURRENT transac
204a0 74 69 6f 6e 2e 20 41 74 20 74 68 69 73 20 70 6f  tion. At this po
204b0 69 6e 74 20 69 74 20 69 73 20 67 75 61 72 61 6e  int it is guaran
204c0 74 65 65 64 20 74 68 61 74 20 74 68 69 73 20 69  teed that this i
204d0 73 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 2d  s .** possible -
204e0 20 74 68 65 20 77 61 6c 20 57 52 49 54 45 52 20   the wal WRITER 
204f0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 61 6e 64  lock is held and
20500 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61   it is known tha
20510 74 20 74 68 65 72 65 20 61 72 65 20 0a 2a 2a 20  t there are .** 
20520 6e 6f 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  no conflicts wit
20530 68 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  h committed tran
20540 73 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  sactions..*/.sta
20550 74 69 63 20 69 6e 74 20 62 74 72 65 65 46 69 78  tic int btreeFix
20560 55 6e 6c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a  Unlocked(Btree *
20570 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
20580 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
20590 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
205a0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
205b0 20 75 38 20 2a 70 31 20 3d 20 70 50 61 67 65 31   u8 *p1 = pPage1
205c0 2d 3e 61 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->aData;.  Pager
205d0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
205e0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
205f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
20600 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 6f 66   /* If page 1 of
20610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20620 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
20630 68 65 6e 20 6e 6f 20 70 61 67 65 73 20 77 65 72  hen no pages wer
20640 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
20650 20 6f 72 20 66 72 65 65 64 20 62 79 20 74 68 69   or freed by thi
20660 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  s transaction. I
20670 6e 20 74 68 69 73 20 63 61 73 65 20 6e 6f 20 73  n this case no s
20680 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
20690 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
206a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
206b0 20 70 61 67 65 20 31 20 69 73 20 64 69 72 74 79   page 1 is dirty
206c0 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
206d0 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d   BtreePtrmap *pM
206e0 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a  ap = pBt->pMap;.
206f0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
20700 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d  get4byte(&p1[32]
20710 29 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20  );.  Pgno nPage 
20720 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
20730 28 70 42 74 29 3b 0a 20 20 75 33 32 20 6e 46 72  (pBt);.  u32 nFr
20740 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
20750 31 5b 33 36 5d 29 3b 0a 0a 20 20 61 73 73 65 72  1[36]);..  asser
20760 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
20770 73 43 6f 6e 63 75 72 72 65 6e 74 28 70 50 61 67  sConcurrent(pPag
20780 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
20790 20 70 42 74 2d 3e 70 4d 61 70 20 29 3b 0a 20 20   pBt->pMap );.  
207a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
207b0 72 55 70 67 72 61 64 65 53 6e 61 70 73 68 6f 74  rUpgradeSnapshot
207c0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 31 2d  (pPager, pPage1-
207d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 61 73 73  >pDbPage);.  ass
207e0 65 72 74 28 20 70 31 3d 3d 70 50 61 67 65 31 2d  ert( p1==pPage1-
207f0 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
20800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20810 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 48 50 61 67  {.    Pgno nHPag
20820 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31  e = get4byte(&p1
20830 5b 32 38 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [28]);.    Pgno 
20840 6e 46 69 6e 20 3d 20 6e 48 50 61 67 65 3b 20 20  nFin = nHPage;  
20850 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20860 66 20 64 62 20 61 66 74 65 72 20 74 72 61 6e 73  f db after trans
20870 61 63 74 69 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a  action merge */.
20880 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
20890 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
208a0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
208b0 29 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) ){.      Pgno 
208c0 69 48 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  iHTrunk = get4by
208d0 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 20  te(&p1[32]);.   
208e0 20 20 20 75 33 32 20 6e 48 46 72 65 65 20 3d 20     u32 nHFree = 
208f0 67 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d  get4byte(&p1[36]
20900 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74  );..      /* Att
20910 61 63 68 20 74 68 65 20 68 65 61 64 20 64 61 74  ach the head dat
20920 61 62 61 73 65 20 66 72 65 65 20 6c 69 73 74 20  abase free list 
20930 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
20940 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20  e current.      
20950 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
20960 66 72 65 65 2d 6c 69 73 74 20 28 69 66 20 61 6e  free-list (if an
20970 79 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  y).  */.      if
20980 28 20 69 54 72 75 6e 6b 21 3d 30 20 29 7b 0a 20  ( iTrunk!=0 ){. 
20990 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
209a0 26 70 31 5b 33 36 5d 2c 20 6e 48 46 72 65 65 20  &p1[36], nHFree 
209b0 2b 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 20 20  + nFree);.      
209c0 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 33    put4byte(&p1[3
209d0 32 5d 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20  2], iTrunk);.   
209e0 20 20 20 20 20 77 68 69 6c 65 28 20 69 54 72 75       while( iTru
209f0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
20a00 44 62 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  DbPage *pTrunk =
20a10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
20a20 6b 75 70 28 70 50 61 67 65 72 2c 20 69 54 72 75  kup(pPager, iTru
20a30 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
20a40 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
20a50 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44  ((u8*)pTrunk->pD
20a60 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ata);.          
20a70 69 66 28 20 69 54 72 75 6e 6b 3d 3d 30 20 29 7b  if( iTrunk==0 ){
20a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
20a90 34 62 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e  4byte((u8*)pTrun
20aa0 6b 2d 3e 70 44 61 74 61 2c 20 69 48 54 72 75 6e  k->pData, iHTrun
20ab0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
20ac0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20ad0 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 72 75  3PagerUnref(pTru
20ae0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b 0a  nk);.        };.
20af0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
20b00 66 28 20 6e 48 50 61 67 65 3c 28 70 4d 61 70 2d  f( nHPage<(pMap-
20b10 3e 69 46 69 72 73 74 2d 31 29 20 29 7b 0a 20 20  >iFirst-1) ){.  
20b20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
20b30 61 62 61 73 65 20 63 6f 6e 73 69 73 74 65 64 20  abase consisted 
20b40 6f 66 20 28 70 4d 61 70 2d 3e 69 46 69 72 73 74  of (pMap->iFirst
20b50 2d 31 29 20 70 61 67 65 73 20 77 68 65 6e 20 74  -1) pages when t
20b60 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
20b70 20 20 20 2a 2a 20 63 6f 6e 63 75 72 72 65 6e 74     ** concurrent
20b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
20b90 20 6f 70 65 6e 65 64 2e 20 41 6e 64 20 61 6e 20   opened. And an 
20ba0 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73  concurrent trans
20bb0 61 63 74 69 6f 6e 20 6d 61 79 0a 20 20 20 20 20  action may.     
20bc0 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 65 78 65     ** not be exe
20bd0 63 75 74 65 64 20 6f 6e 20 61 6e 20 61 75 74 6f  cuted on an auto
20be0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
20bf0 20 2d 20 73 6f 20 74 68 65 20 64 62 20 73 68 6f   - so the db sho
20c00 75 6c 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  uld .        ** 
20c10 6e 6f 74 20 68 61 76 65 20 73 68 72 75 6e 6b 20  not have shrunk 
20c20 73 69 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61  since the transa
20c30 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
20c40 2e 20 54 68 65 72 65 66 6f 72 65 20 6e 48 50 61  . Therefore nHPa
20c50 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ge.        ** sh
20c60 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 28  ould be set to (
20c70 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20  pMap->iFirst-1) 
20c80 6f 72 20 67 72 65 61 74 65 72 2e 20 2a 2f 0a 20  or greater. */. 
20c90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20ca0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20cb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20cc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
20cd0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
20ce0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73   allocated pages
20cf0 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 74 68   pMap->iFirst th
20d00 72 6f 75 67 68 0a 20 20 20 20 20 20 20 20 2a 2a  rough.        **
20d10 20 6e 50 61 67 65 20 28 69 6e 63 6c 75 73 69 76   nPage (inclusiv
20d20 65 29 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  e) at the end of
20d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20d40 6c 65 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a 20  le. Meanwhile,. 
20d50 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
20d60 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68 61 76  transactions hav
20d70 65 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 46 69  e allocated (iFi
20d80 72 73 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53 6f  rst..nHPage). So
20d90 20 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a   move.        **
20da0 20 70 61 67 65 73 20 28 69 46 69 72 73 74 2e 2e   pages (iFirst..
20db0 4d 49 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67 65  MIN(nPage,nHPage
20dc0 29 29 20 74 6f 20 28 4d 41 58 28 6e 50 61 67 65  )) to (MAX(nPage
20dd0 2c 6e 48 50 61 67 65 29 2b 31 29 2e 20 20 2a 2f  ,nHPage)+1).  */
20de0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4c  .        Pgno iL
20df0 61 73 74 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c  ast = MIN(nPage,
20e00 20 6e 48 50 61 67 65 29 3b 20 20 20 20 2f 2a 20   nHPage);    /* 
20e10 4c 61 73 74 20 70 61 67 65 20 74 6f 20 6d 6f 76  Last page to mov
20e20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e  e */.        Pgn
20e30 6f 20 6e 43 75 72 72 65 6e 74 3b 20 20 20 20 20  o nCurrent;     
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
20e60 20 6f 66 20 64 62 20 2a 2f 0a 20 20 20 20 20 20   of db */.      
20e70 20 20 6e 43 75 72 72 65 6e 74 20 3d 20 4d 41 58    nCurrent = MAX
20e80 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65 29 3b  (nPage, nHPage);
20e90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
20ea0 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65  reeRelocateRange
20eb0 28 70 42 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72  (pBt, pMap->iFir
20ec0 73 74 2c 20 69 4c 61 73 74 2c 20 26 6e 43 75 72  st, iLast, &nCur
20ed0 72 65 6e 74 29 3b 0a 0a 20 20 20 20 20 20 20 20  rent);..        
20ee0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77  /* There are now
20ef0 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77   no collisions w
20f00 69 74 68 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ith the snapshot
20f10 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 20   at the head of 
20f20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
20f30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
20f40 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
20f50 74 20 77 6f 75 6c 64 20 62 65 20 70 6f 73 73 69  t would be possi
20f60 62 6c 65 20 74 6f 20 77 72 69 74 65 0a 20 20 20  ble to write.   
20f70 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e       ** the tran
20f80 73 61 63 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  saction out to d
20f90 69 73 6b 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  isk. Before doin
20fa0 67 20 73 6f 20 74 68 6f 75 67 68 2c 20 61 74 74  g so though, att
20fb0 65 6d 70 74 20 74 6f 0a 20 20 20 20 20 20 20 20  empt to.        
20fc0 2a 2a 20 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65  ** relocate some
20fd0 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61 67 65   of the new page
20fe0 73 20 74 6f 20 66 72 65 65 20 6c 6f 63 61 74 69  s to free locati
20ff0 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 62  ons within the b
21000 6f 64 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ody.        ** o
21010 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21020 69 6c 65 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c  ile (i.e. free-l
21030 69 73 74 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f  ist entries). */
21040 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
21050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21060 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21070 6e 43 75 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e  nCurrent!=PENDIN
21080 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21090 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
210a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73  lite3PagerSetDbs
210b0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
210c0 20 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   nCurrent);.    
210d0 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65        nFree = ge
210e0 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b  t4byte(&p1[36]);
210f0 0a 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20  .          nFin 
21100 3d 20 4d 41 58 28 6e 43 75 72 72 65 6e 74 2d 6e  = MAX(nCurrent-n
21110 46 72 65 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20  Free, nHPage);. 
21120 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 75           if( nCu
21130 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59  rrent>PENDING_BY
21140 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
21150 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin<=PENDING_BY
21160 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
21170 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e              nFin
21180 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  --;.          }.
21190 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
211a0 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67  treeRelocateRang
211b0 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c 20 6e  e(pBt, nFin+1, n
211c0 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  Current, 0);.   
211d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
211e0 70 75 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  put4byte(&p1[28]
211f0 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 7d  , nFin);.      }
21200 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21210 65 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65  e3PagerSetDbsize
21220 28 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  (pPager, nFin);.
21230 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
21240 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
21250 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
21260 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
21270 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
21280 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
21290 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
212a0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
212b0 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
212c0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
212d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
212e0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
212f0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
21300 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
21310 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
21320 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
21330 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
21340 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
21350 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
21360 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
21370 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
21380 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
21390 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
213a0 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
213b0 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
213c0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
213d0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
213e0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
213f0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
21400 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
21410 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
21420 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
21430 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
21440 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
21450 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
21460 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21470 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
21480 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
21490 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
214a0 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
214b0 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
214c0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
214d0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
214e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
214f0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
21500 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
21510 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
21520 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
21530 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
21540 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
21550 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
21560 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
21570 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
21580 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
21590 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
215a0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
215b0 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
215c0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
215d0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
215e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
215f0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
21600 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
21610 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
21620 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
21630 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
21640 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
21650 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
21660 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
21670 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
21680 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
21690 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
216a0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
216b0 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
216c0 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
216d0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
216e0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
216f0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
21700 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
21710 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
21720 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
21730 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
21740 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
21750 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
21760 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
21770 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
21780 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
21790 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
217a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
217b0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
217c0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
217d0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
217e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
217f0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
21800 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
21810 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
21820 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21830 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21840 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64  Enter(p);..#ifnd
21850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
21860 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
21870 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21880 6d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m ){.      asser
21890 74 28 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d  t( ISCONCURRENT=
218a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
218b0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
218c0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
218d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
218e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
218f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21900 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21910 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21920 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
21930 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
21940 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21950 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
21960 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
21970 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
21980 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d  ndif.    if( rc=
21990 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53  =SQLITE_OK && IS
219a0 43 4f 4e 43 55 52 52 45 4e 54 20 29 7b 0a 20 20  CONCURRENT ){.  
219b0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 46 69      rc = btreeFi
219c0 78 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20  xUnlocked(p);.  
219d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
219e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
219f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21a00 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
21a10 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
21a20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
21a30 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
21a40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
21a50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21a60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21a70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
21a80 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
21a90 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
21aa0 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
21ab0 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
21ac0 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
21ad0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
21ae0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
21af0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
21b00 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
21b10 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21b20 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
21b30 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
21b40 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
21b50 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
21b60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21b70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21b80 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
21b90 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
21ba0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
21bb0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
21bc0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
21bd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
21be0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
21bf0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
21c00 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
21c10 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
21c20 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
21c30 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
21c40 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
21c50 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
21c60 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
21c70 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
21c80 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21c90 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
21ca0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
21cb0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
21cc0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
21cd0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
21cf0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
21d00 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
21d10 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
21d20 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
21d30 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
21d40 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
21d50 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
21d60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
21d70 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
21d80 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
21d90 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
21da0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
21db0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
21dc0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
21dd0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
21de0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
21df0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
21e00 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
21e10 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
21e20 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
21e30 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
21e40 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
21e50 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
21e60 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
21e70 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
21e80 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21e90 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
21ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21eb0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
21ec0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
21ed0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
21ee0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
21ef0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
21f00 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
21f10 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
21f20 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
21f30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
21f40 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
21f50 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
21f60 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
21f70 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
21f80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61  .  /* If this wa
21f90 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  s an CONCURRENT 
21fa0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c  transaction, del
21fb0 65 74 65 20 74 68 65 20 70 42 74 2d 3e 70 4d 61  ete the pBt->pMa
21fc0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 62 74  p object */.  bt
21fd0 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65 28  reePtrmapDelete(
21fe0 70 42 74 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  pBt);.  btreeInt
21ff0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
22000 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
22010 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
22020 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
22030 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22040 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
22050 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
22060 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
22070 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
22080 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
22090 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
220a0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
220b0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
220c0 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
220d0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
220e0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
220f0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
22100 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
22110 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
22120 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
22130 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
22140 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
22150 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
22160 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
22170 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
22180 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
22190 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
221a0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
221b0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
221c0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
221d0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
221e0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
221f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
22200 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
22210 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
22220 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
22230 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
22240 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
22250 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
22260 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
22270 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
22280 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
22290 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
222a0 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
222b0 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
222c0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
222d0 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
222e0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
222f0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
22300 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
22310 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
22320 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
22330 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
22340 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
22350 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
22360 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
22370 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
22380 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
22390 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
223a0 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
223b0 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
223c0 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
223d0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
223e0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
223f0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
22400 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
22410 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
22420 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22430 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
22440 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
22450 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
22460 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
22470 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
22480 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
22490 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
224a0 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
224b0 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
224c0 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
224d0 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
224e0 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
224f0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
22500 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
22510 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
22520 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22530 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
22540 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
22550 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
22560 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
22570 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
22580 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
22590 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
225a0 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
225b0 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
225c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
225d0 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
225e0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
225f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
22600 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
22610 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
22620 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
22630 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
22640 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
22650 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
22660 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
22670 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
22680 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
22690 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
226a0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
226b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
226c0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
226d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
226e0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
226f0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
22700 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
22710 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
22720 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
22730 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
22740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
22750 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
22760 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
22770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22780 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
22790 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
227a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
227b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
227c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
227d0 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
227e0 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
227f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
22800 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
22810 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
22820 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
22830 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
22840 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
22850 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
22860 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
22870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22880 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
22890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
228a0 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
228b0 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
228c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
228d0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
228e0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
228f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
22900 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
22910 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
22920 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
22930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22940 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
22950 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
22960 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
22970 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
22980 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22990 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
229a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
229b0 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
229c0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
229d0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
229e0 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
229f0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
22a00 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
22a10 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
22a20 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
22a30 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
22a40 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
22a50 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
22a60 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
22a70 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
22a80 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
22a90 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
22aa0 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
22ab0 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
22ac0 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
22ad0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
22ae0 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
22af0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22b00 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
22b10 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
22b20 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
22b30 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
22b40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
22b50 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
22b60 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
22b70 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
22b80 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
22b90 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
22ba0 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
22bb0 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
22bc0 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
22bd0 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
22be0 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
22bf0 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
22c00 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
22c10 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
22c20 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
22c30 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
22c40 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
22c50 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
22c60 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
22c70 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
22c80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
22c90 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
22ca0 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
22cb0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
22cc0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
22cd0 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
22ce0 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
22cf0 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
22d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
22d10 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
22d20 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
22d30 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
22d40 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
22d50 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
22d60 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
22d70 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
22d80 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
22d90 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
22da0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
22db0 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
22dc0 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
22dd0 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
22de0 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
22df0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
22e00 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
22e10 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
22e20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
22e30 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
22e40 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
22e50 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
22e60 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
22e70 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
22e80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
22e90 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
22ea0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
22eb0 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
22ec0 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
22ed0 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
22ee0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22ef0 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
22f00 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
22f10 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
22f20 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
22f30 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
22f40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22f50 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
22f60 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
22f70 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
22f80 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
22f90 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
22fa0 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79     if( writeOnly
22fb0 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73   && (p->curFlags
22fc0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
22fd0 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
22fe0 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d   if( p->eState==
22ff0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
23000 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
23010 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
23020 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
23030 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
23040 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
23050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ){.            (
23070 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65  void)sqlite3Btre
23080 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
23090 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a  pBtree, rc, 0);.
230a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
230b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
230c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
230d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
230e0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
230f0 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20  ursor(p);.      
23100 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
23110 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
23120 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
23130 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  = errCode;.     
23140 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
23150 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
23160 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  ++){.        rel
23170 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
23180 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[i]);.        
23190 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
231a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
231b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
231c0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
231d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
231e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
231f0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
23200 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  n in progress..*
23210 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65  *.** If tripCode
23220 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
23230 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77  K then cursors w
23240 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
23250 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a  ed (tripped)..**
23260 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
23270 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20  ors are tripped 
23280 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
23290 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72  true but all cur
232a0 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70  sors are.** trip
232b0 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
232c0 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20   is false.  Any 
232d0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a  attempt to use.*
232e0 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73  * a tripped curs
232f0 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  or will result i
23300 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
23310 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
23320 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
23330 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
23340 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
23350 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
23360 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
23370 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
23380 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
23390 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
233a0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
233b0 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c  p, int tripCode,
233c0 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
233d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
233e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
233f0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
23400 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
23410 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20  t( writeOnly==1 
23420 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  || writeOnly==0 
23430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69  );.  assert( tri
23440 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42  pCode==SQLITE_AB
23450 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  ORT_ROLLBACK || 
23460 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
23470 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
23480 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
23490 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
234a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
234b0 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
234c0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
234d0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
234e0 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c  f( rc ) writeOnl
234f0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
23500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23510 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
23520 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  ipCode ){.    in
23530 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42  t rc2 = sqlite3B
23540 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
23550 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  rs(p, tripCode, 
23560 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20  writeOnly);.    
23570 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
23580 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f  TE_OK || (writeO
23590 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53  nly==0 && rc2==S
235a0 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20  QLITE_OK) );.   
235b0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
235c0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
235d0 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67    }.  btreeInteg
235e0 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
235f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23600 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
23610 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
23620 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
23630 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
23640 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
23650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
23660 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
23670 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
23680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23690 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
236a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
236b0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
236c0 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
236d0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
236e0 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
236f0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
23700 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
23710 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
23720 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
23730 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
23740 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
23750 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
23760 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
23770 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
23780 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
23790 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
237a0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
237b0 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
237c0 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
237d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
237e0 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
237f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
23800 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
23810 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
23820 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
23830 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
23840 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
23850 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
23860 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
23870 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
23880 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
23890 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
238a0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
238b0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
238c0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
238d0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
238e0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
238f0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
23900 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
23910 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
23920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23930 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
23940 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
23950 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
23960 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
23970 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
23980 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
23990 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
239a0 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
239b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
239c0 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
239d0 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
239e0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
239f0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
23a00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
23a10 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
23a20 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
23a30 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
23a40 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
23a50 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
23a60 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
23a70 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
23a80 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
23a90 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
23aa0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
23ab0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
23ac0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
23ad0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
23ae0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
23af0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
23b00 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
23b10 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
23b20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
23b30 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
23b40 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
23b50 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
23b60 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
23b70 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
23b80 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
23b90 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
23ba0 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
23bb0 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
23bc0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23bd0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
23be0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23bf0 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
23c00 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
23c10 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
23c20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
23c30 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
23c40 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
23c50 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
23c60 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
23c70 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
23c80 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
23c90 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
23ca0 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
23cb0 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
23cc0 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
23cd0 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
23ce0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
23cf0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
23d00 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
23d10 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
23d20 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
23d30 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
23d40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
23d50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23d60 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
23d70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
23d80 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
23d90 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
23db0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
23dc0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
23dd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
23de0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
23df0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
23e00 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
23e10 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
23e20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
23e30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
23e40 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
23e50 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
23e60 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
23e70 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
23e80 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
23e90 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
23ea0 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
23eb0 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
23ec0 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
23ed0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
23ee0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
23ef0 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
23f00 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
23f10 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
23f20 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
23f30 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
23f40 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
23f50 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
23f60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23f70 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
23f80 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
23f90 61 74 65 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  atement);.  if( 
23fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23fb0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 50  .    rc = btreeP
23fc0 74 72 6d 61 70 42 65 67 69 6e 28 70 42 74 2c 20  trmapBegin(pBt, 
23fd0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d  iStatement);.  }
23fe0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
23ff0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
24000 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
24010 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24020 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
24030 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
24040 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
24050 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
24060 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
24070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
24080 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
24090 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
240a0 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
240b0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
240c0 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
240d0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
240e0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
240f0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
24100 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
24110 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
24120 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
24130 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
24140 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
24150 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
24160 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
24170 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
24180 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
24190 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
241a0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
241b0 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
241c0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
241d0 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
241e0 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
241f0 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
24200 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
24210 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
24220 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
24230 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
24240 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
24250 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
24260 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
24270 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
24280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24290 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
242a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
242b0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
242c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
242d0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
242e0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
242f0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
24300 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
24310 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
24320 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
24330 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
24340 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
24350 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
24360 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
24370 70 29 3b 0a 20 20 20 20 62 74 72 65 65 50 74 72  p);.    btreePtr
24380 6d 61 70 45 6e 64 28 70 42 74 2c 20 6f 70 2c 20  mapEnd(pBt, op, 
24390 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
243a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
243b0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
243c0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
243d0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
243e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
243f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
24400 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
24410 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24420 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
24430 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
24440 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
24450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
24460 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
24470 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
24480 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
24490 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
244a0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
244b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
244c0 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
244d0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
244e0 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
244f0 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
24500 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
24510 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
24520 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
24530 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
24540 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
24550 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
24560 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
24570 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
24580 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24590 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
245a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
245b0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
245c0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
245d0 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
245e0 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
245f0 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
24600 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
24610 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
24620 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
24630 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
24640 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
24650 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
24660 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
24670 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
24680 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
24690 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
246a0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
246b0 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
246c0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
246d0 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
246e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
246f0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
24700 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
24710 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
24720 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
24730 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
24740 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
24750 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
24760 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
24770 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
24780 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
24790 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
247a0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
247b0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
247c0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
247d0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
247e0 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
247f0 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
24800 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
24810 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
24820 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
24830 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
24840 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
24850 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
24860 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
24870 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
24880 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
24890 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
248a0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
248b0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
248c0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
248d0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
248e0 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
248f0 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
24900 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
24910 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
24920 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
24930 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
24940 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
24950 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
24960 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
24970 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
24980 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
24990 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
249a0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
249b0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
249c0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
249d0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
249e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
249f0 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
24a00 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
24a10 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
24a20 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
24a30 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
24a40 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
24a50 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
24a60 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
24a70 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
24a80 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
24a90 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
24aa0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
24ab0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24ac0 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
24ad0 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
24ae0 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
24af0 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
24b00 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
24b10 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
24b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
24b30 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
24b40 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
24b70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
24b80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ba0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
24bb0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
24bc0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
24bf0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
24c00 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
24c10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
24c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
24c30 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
24c40 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
24c50 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
24c60 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24c80 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
24c90 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
24ca0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
24cb0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
24cc0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
24cd0 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
24ce0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b  .  BtCursor *pX;
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
24d10 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20  ping over other 
24d20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a  all cursors */..
24d30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24d40 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
24d50 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
24d60 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
24d70 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  Flag==1 );..  /*
24d80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
24d90 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
24da0 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
24db0 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
24dc0 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
24dd0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
24de0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
24df0 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
24e00 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
24e10 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
24e20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
24e30 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
24e40 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
24e50 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
24e60 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
24e70 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
24e80 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
24e90 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
24ea0 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31  nfo!=0, wrFlag+1
24eb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
24ec0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73  rFlag==0 || !has
24ed0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
24ee0 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f   iTable) );..  /
24ef0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
24f00 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65  e caller has ope
24f10 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ned the required
24f20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
24f30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
24f40 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
24f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
24f60 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e  Flag==0 || p->in
24f70 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
24f80 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
24f90 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70  pBt->pPage1 && p
24fa0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
24fb0 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  a );.  assert( w
24fc0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74  rFlag==0 || (pBt
24fd0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
24fe0 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
24ff0 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20  ;..  if( wrFlag 
25000 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  ){.    allocateT
25010 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
25020 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
25030 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
25040 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
25050 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
25060 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65  ==1 && btreePage
25070 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b  count(pBt)==0 ){
25080 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46  .    assert( wrF
25090 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54  lag==0 );.    iT
250a0 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  able = 0;.  }.. 
250b0 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
250c0 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
250d0 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
250e0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
250f0 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
25100 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74  ables and link t
25110 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
25120 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
25130 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67  .  */.  pCur->pg
25140 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
25150 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69  Table;.  pCur->i
25160 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75  Page = -1;.  pCu
25170 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
25180 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
25190 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
251a0 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
251b0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
251c0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54  =0 || wrFlag==BT
251d0 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b 0a  CF_WriteFlag );.
251e0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
251f0 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
25200 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
25210 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
25220 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
25230 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
25240 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
25250 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
25260 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
25270 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
25280 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
25290 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
252a0 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
252b0 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
252c0 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
252d0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
252e0 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
252f0 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
25300 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
25310 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
25320 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
25330 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
25340 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
25350 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
25360 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
25370 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
25380 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
25390 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
253a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
253b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
253c0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
253d0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
253e0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25410 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
25420 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
25450 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
25460 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
25470 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
254a0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
254b0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
254c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
254d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
254e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
254f0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
25500 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
25510 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
25540 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
25550 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
25560 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
25570 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25580 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
25590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
255a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
255b0 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
255c0 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
255d0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
255e0 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
255f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
25600 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25610 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25620 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
25630 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
25640 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
25650 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
25660 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
25670 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
25680 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
25690 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
256a0 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
256b0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
256c0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
256d0 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
256e0 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
256f0 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
25700 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
25710 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
25720 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
25730 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25740 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
25750 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
25760 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
25770 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
25780 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
25790 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
257a0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
257b0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
257c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
257d0 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
257e0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
257f0 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
25800 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
25810 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
25820 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
25830 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
25840 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
25850 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
25860 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
25870 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
25880 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
25890 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
258a0 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
258b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
258c0 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
258d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
258e0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
258f0 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
25900 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
25910 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
25920 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
25930 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
25940 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
25950 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25960 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
25970 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
25980 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
25990 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
259a0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
259b0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
259c0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
259d0 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
259e0 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
259f0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
25a00 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
25a10 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
25a20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
25a30 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
25a40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
25a50 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
25a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
25a70 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
25a80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
25a90 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
25aa0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
25ab0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
25ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25ad0 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
25ae0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
25af0 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
25b00 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
25b10 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
25b20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
25b30 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
25b40 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
25b50 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
25b60 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
25b70 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
25b80 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
25b90 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
25ba0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25bb0 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
25bc0 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
25bd0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
25be0 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
25bf0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
25c00 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
25c10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
25c20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
25c30 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
25c40 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
25c50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
25c60 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
25c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25c80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
25c90 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
25ca0 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
25cb0 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
25cc0 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
25cd0 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
25ce0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
25cf0 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
25d00 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
25d10 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
25d20 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
25d30 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
25d40 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
25d50 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
25d60 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
25d70 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
25d80 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
25d90 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
25da0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
25db0 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ()..*/.#ifndef N
25dc0 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
25dd0 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
25de0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
25df0 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
25e00 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
25e10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
25e20 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
25e30 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
25e40 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
25e50 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
25e60 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
25e70 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
25e80 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
25e90 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
25ea0 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e  DB || memcmp(&in
25eb0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
25ec0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
25ed0 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
25ee0 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
25ef0 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
25f00 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  f.static SQLITE_
25f10 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65  NOINLINE void ge
25f20 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
25f30 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
25f40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25f50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==0 ){.    int 
25f60 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
25f70 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  age;.    pCur->c
25f80 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
25f90 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
25fa0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
25fb0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
25fc0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
25fd0 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
25fe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25ff0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
26000 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
26010 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
26020 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
26030 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
26040 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
26050 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
26060 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
26070 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
26080 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
26090 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
260a0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
260b0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
260c0 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
260d0 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
260e0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
260f0 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
26100 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
26110 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
26120 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
26130 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
26140 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
26150 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26160 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
26170 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26180 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
26190 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
261a0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
261b0 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
261c0 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
261d0 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
261e0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
261f0 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
26200 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
26210 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
26220 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
26230 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
26240 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
26250 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
26260 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
26270 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
26280 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
26290 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
262a0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
262b0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
262c0 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
262d0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
262e0 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
262f0 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
26300 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
26310 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
26320 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
26330 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
26340 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
26350 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
26360 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
26370 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
26380 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
26390 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
263a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
263b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
263c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
263d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
263e0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
263f0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
26400 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65  >info.nKey;.  re
26410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26420 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
26430 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
26440 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
26450 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
26460 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
26470 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
26480 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
26490 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
264a0 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
264b0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
264c0 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
264d0 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
264e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
264f0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
26500 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
26510 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
26520 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
26530 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
26540 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
26550 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
26560 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
26570 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
26580 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
26590 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
265a0 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
265b0 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
265c0 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
265d0 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
265e0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
265f0 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
26600 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
26610 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
26620 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
26630 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26640 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
26650 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26660 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26670 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26680 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26690 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
266a0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
266b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
266c0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
266d0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
266e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
266f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26700 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  age]->intKeyLeaf
26710 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ==1 );.  getCell
26720 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
26730 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
26740 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  o.nPayload;.  re
26750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26760 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
26770 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
26780 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
26790 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
267a0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
267b0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
267c0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
267d0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
267e0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
267f0 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
26800 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
26810 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
26820 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
26830 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
26840 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
26850 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
26860 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
26870 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
26880 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
26890 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
268a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
268b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
268c0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
268d0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
268e0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
268f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
26900 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
26910 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
26920 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
26930 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
26940 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
26950 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
26960 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
26970 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
26980 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
26990 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
269a0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
269b0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
269c0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
269d0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
269e0 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
269f0 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
26a00 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
26a10 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
26a20 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
26a30 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
26a40 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
26a50 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
26a60 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
26a70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
26a80 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
26a90 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
26aa0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
26ab0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
26ac0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
26ad0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
26ae0 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
26af0 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
26b00 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
26b10 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
26b20 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
26b30 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
26b40 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26b50 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
26b60 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
26b70 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
26b80 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
26b90 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
26ba0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
26bb0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
26bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26bd0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
26be0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
26bf0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
26c00 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
26c10 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
26c20 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
26c30 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
26c40 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
26c50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
26c60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26c70 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
26c80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26c90 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
26ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
26cb0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
26cc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26cd0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
26ce0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
26cf0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
26d00 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
26d10 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
26d20 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
26d30 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
26d40 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
26d50 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
26d60 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
26d70 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
26d80 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
26d90 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
26da0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
26db0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
26dc0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
26dd0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
26de0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
26df0 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
26e00 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
26e10 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
26e20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
26e30 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
26e40 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
26e50 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
26e60 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
26e70 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
26e80 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
26e90 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
26ea0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
26eb0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
26ec0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
26ed0 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
26ee0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
26ef0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
26f00 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
26f10 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
26f20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26f30 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
26f40 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
26f50 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
26f60 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
26f70 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
26f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
26f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26fa0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
26fb0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
26fc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
26fd0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
26fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
26ff0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
27000 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
27010 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
27020 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
27030 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
27040 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
27050 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
27060 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
27070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27080 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
27090 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
270a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
270b0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
270c0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
270d0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
270e0 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
270f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
27100 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
27110 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
27120 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
27130 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
27140 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
27150 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
27160 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
27170 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
27180 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
27190 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
271a0 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
271b0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
271c0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
271d0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
271e0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
271f0 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
27200 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
27210 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
27220 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
27230 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
27240 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
27250 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
27260 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
27270 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
27280 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
27290 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
272a0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
272b0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
272c0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
272d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
272e0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
272f0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
27300 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
27310 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
27320 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
27330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
27340 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
27350 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
27360 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
27370 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27380 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
27390 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
273a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
273b0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
273c0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
273f0 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
27400 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
27410 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
27420 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
27430 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
27440 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
27450 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
27460 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
27470 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
27480 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
27490 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
274a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
274b0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
274c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
274d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
274e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
274f0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
27500 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
27510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
27520 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
27530 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
27540 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
27550 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
27560 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
27570 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
27580 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27590 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
275a0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
275b0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
275c0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
275d0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
275e0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
275f0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
27600 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
27610 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
27620 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
27630 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
27640 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
27650 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
27660 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
27670 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
27680 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
27690 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
276a0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
276b0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
276c0 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
276d0 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
276e0 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
276f0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
27700 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
27710 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
27720 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
27730 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
27740 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
27750 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
27760 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
27770 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
27780 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
27790 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
277a0 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
277b0 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
277c0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
277d0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
277e0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
277f0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
27800 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
27810 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
27820 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
27830 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
27840 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
27850 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
27860 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
27870 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
27880 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20  y .** populates 
27890 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
278a0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
278b0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
278c0 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
278d0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
278e0 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
278f0 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
27900 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
27910 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
27920 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
27930 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
27940 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
27950 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
27960 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
27970 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
27980 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
27990 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
279a0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
279b0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
279c0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
279d0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
279e0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
279f0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
27a00 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
27a10 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
27a20 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
27a30 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
27a40 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
27a50 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
27a60 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
27a70 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
27a80 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
27a90 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
27aa0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
27ab0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
27ac0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
27ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
27ae0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
27af0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
27b00 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
27b10 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
27b20 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
27b30 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
27b40 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
27b50 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
27b60 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
27b70 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
27b80 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
27b90 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
27ba0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
27bb0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
27bc0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
27bd0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
27be0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
27bf0 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
27c00 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
27c10 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
27c20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
27c30 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
27c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27c50 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
27c60 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
27c70 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27c80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
27c90 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
27ca0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
27cb0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
27cc0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ce0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
27cf0 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
27d00 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
27d10 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
27d20 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
27d30 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
27d40 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
27d50 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20  .  int bEnd;    
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d80 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20  True if reading 
27d90 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a  to end of data *
27da0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
27db0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
27dc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27dd0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27de0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
27df0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27e00 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
27e10 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
27e20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27e30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27e40 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20  sert( eOp!=2 || 
27e50 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  offset==0 );    
27e60 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20  /* Always start 
27e70 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66  from beginning f
27e80 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20  or eOp==2 */..  
27e90 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
27ea0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
27eb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27ec0 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  oad;.#ifdef SQLI
27ed0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
27ee0 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d  OW_READ.  bEnd =
27ef0 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75   offset+amt==pCu
27f00 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
27f10 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
27f20 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  t( offset+amt <=
27f30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
27f40 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26  load );..  if( &
27f50 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
27f60 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
27f70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
27f80 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
27f90 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
27fa0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
27fb0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
27fc0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
27fd0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
27fe0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27ff0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
28000 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
28010 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
28020 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
28030 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
28040 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
28050 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
28060 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
28070 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
28080 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
28090 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
280a0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
280b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
280c0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
280d0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
280e0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
280f0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
28100 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d   & 0x01), pPage-
28110 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
28120 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
28130 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
28140 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
28150 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
28160 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28170 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63  ;.  }...  if( rc
28180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
28190 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
281a0 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
281b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
281c0 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
281d0 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
281e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
281f0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
28200 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
28210 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
28220 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28230 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
28240 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
28250 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20  rflow[] has not 
28260 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
28270 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
28280 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  .    ** Except, 
28290 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  do not allocate 
282a0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20  aOverflow[] for 
282b0 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20  eOp==2..    **. 
282c0 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
282d0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
282e0 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
282f0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
28300 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
28310 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
28320 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
28330 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
28340 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
28350 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
28360 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
28370 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
28380 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
28390 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
283a0 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
283b0 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
283c0 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
283d0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
283e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21   */.    if( eOp!
283f0 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  =2 && (pCur->cur
28400 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
28410 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20  idOvfl)==0 ){.  
28420 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
28430 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
28440 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
28450 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
28460 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
28470 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75     if( nOvfl>pCu
28480 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b  r->nOvflAlloc ){
28490 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61  .        Pgno *a
284a0 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c  New = (Pgno*)sql
284b0 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20  ite3Realloc(.   
284c0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
284d0 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a  Overflow, nOvfl*
284e0 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20  2*sizeof(Pgno). 
284f0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28500 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
28510 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28520 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28540 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76         pCur->nOv
28550 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a  flAlloc = nOvfl*
28560 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  2;.          pCu
28570 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
28580 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
28590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
285a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
285b0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
285c0 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
285d0 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
285e0 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
285f0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28600 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76   |= BTCF_ValidOv
28610 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fl;.      }.    
28620 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
28630 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
28640 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
28650 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
28660 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
28670 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
28680 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
28690 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
286a0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
286b0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
286c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
286d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
286e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
286f0 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61  .     && pCur->a
28700 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
28710 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b  ovflSize].    ){
28720 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
28730 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
28740 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
28750 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
28760 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
28770 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
28780 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
28790 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
287a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
287b0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
287c0 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20   iIdx++){..     
287d0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
287e0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
287f0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
28800 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
28810 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
28820 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
28830 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20  dOvfl)!=0 ){.   
28840 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
28850 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28860 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
28870 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
28880 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
28890 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
288a0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
288b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
288c0 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
288d0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
288e0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
288f0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
28900 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
28910 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
28920 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
28930 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
28940 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
28950 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
28960 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
28970 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
28980 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
28990 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
289a0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
289b0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
289c0 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
289d0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
289e0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
289f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
28a00 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
28a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
28a20 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66   that the aOverf
28a30 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74  low[] array must
28a40 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   be allocated be
28a50 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20  cause eOp!=2.   
28a60 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49       ** here.  I
28a70 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f  f eOp==2, then o
28a80 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69  ffset==0 and thi
28a90 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65  s branch is neve
28aa0 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20  r taken..       
28ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
28ac0 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20  rt( eOp!=2 );.  
28ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28ae0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
28af0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
28b00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28b10 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
28b20 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  b==pBt->db );.  
28b30 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
28b40 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
28b50 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
28b60 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
28b70 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
28b80 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ];.        }else
28b90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28ba0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
28bb0 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
28bc0 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
28bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28be0 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
28bf0 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
28c00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
28c10 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
28c20 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
28c30 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
28c40 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
28c50 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
28c60 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
28c70 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
28c80 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
28c90 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
28ca0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
28cb0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
28cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
28cd0 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20  le *fd;.#endif. 
28ce0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
28cf0 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
28d00 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
28d10 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
28d20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
28d30 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
28d40 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
28d50 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
28d60 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
28d70 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
28d80 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
28d90 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
28da0 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
28db0 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
28dc0 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
28dd0 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
28de0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
28df0 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
28e00 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
28e10 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
28e20 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62  *   3) the datab
28e30 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
28e40 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
28e50 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73  **   4) there is
28e60 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
28e70 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
28e80 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20          **   5) 
28e90 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
28ea0 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61  not a WAL databa
28eb0 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  se,.        **  
28ec0 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f   6) all data fro
28ed0 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  m the page is be
28ee0 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20  ing read..      
28ef0 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61    **   7) at lea
28f00 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
28f10 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
28f20 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
28f30 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
28f40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28f50 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
28f60 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
28f70 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
28f80 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
28f90 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
28fa0 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
28fb0 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
28fc0 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
28fd0 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
28fe0 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
28ff0 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
29000 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
29010 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
29020 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29030 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d  if( (eOp&0x01)==
29040 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
29070 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
29080 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
290c0 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61     && (bEnd || a
290d0 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20  ==ovflSize)     
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
29100 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
29110 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
29120 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29140 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
29150 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
29160 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
29170 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
29180 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33  ethods     /* (3
29190 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
291a0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
291b0 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20  ata[19]==0x01   
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
291e0 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
291f0 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29220 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (7) */.        )
29230 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
29240 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
29250 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
29260 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
29270 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
29280 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
29290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
292a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e            /* hen
292b0 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  ce (7) */.      
292c0 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
292d0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
292e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
292f0 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
29300 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
29310 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
29320 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
29330 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
29340 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
29350 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
29360 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
29370 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
29380 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
29390 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
293a0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
293b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
293c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
293d0 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
293e0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
293f0 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
29400 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
29410 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
29420 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
29430 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
29440 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
29450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29460 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
29470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
29480 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
29490 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
294a0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
294b0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
294c0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
294d0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
294e0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
294f0 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
29500 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
29510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
29520 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
29530 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
29540 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
29550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29560 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
29570 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
29580 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
29590 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
295a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
295b0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
295c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
295d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
295e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
295f0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
29600 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
29610 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
29620 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
29630 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
29640 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
29650 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
29660 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
29670 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
29680 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  t"..**.** The ca
29690 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
296a0 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
296b0 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69  inting to a vali
296c0 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20  d row.** in the 
296d0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  table..**.** Ret
296e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
296f0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
29700 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
29710 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
29720 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
29730 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
29740 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
29750 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
29760 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
29770 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
29780 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
29790 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
297a0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
297b0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
297c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
297d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
297e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
297f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29800 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
29810 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
29820 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
29830 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
29840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29850 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29860 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
29870 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
29880 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
29890 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
298a0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
298b0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
298c0 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
298d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
298e0 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f  of the data asso
298f0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
29900 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
29910 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
29920 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
29930 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
29940 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
29950 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
29960 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
29970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
29980 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
29990 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
299a0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
299b0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
299c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
299d0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
299e0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
299f0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
29a00 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
29a10 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72  3BtreeData(BtCur
29a20 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
29a30 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
29a40 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
29a50 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20  nt rc;..#ifndef 
29a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
29a70 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72  BLOB.  if ( pCur
29a80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29a90 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
29aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
29ab0 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ORT;.  }.#endif.
29ac0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29ad0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
29ae0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
29af0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
29b00 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
29b10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29b20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29b30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29b40 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
29b50 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
29b60 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
29b70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29b80 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ] );.    assert(
29b90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29ba0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
29bb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29bc0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
29bd0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
29be0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
29bf0 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
29c00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29c10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
29c20 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
29c30 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
29c40 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
29c50 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
29c60 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
29c70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
29c80 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
29c90 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
29ca0 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e  ** the key if in
29cb0 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67  dex btrees (pPag
29cc0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e  e->intKey==0) an
29cd0 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f  d is the data fo
29ce0 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65  r.** table btree
29cf0 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
29d00 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72  ==1). The number
29d10 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
29d20 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61  ilable.** key/da
29d30 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ta is written in
29d40 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
29d50 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
29d60 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e   value.** return
29d70 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ed will not be a
29d80 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
29d90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29da0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
29db0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
29dc0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
29dd0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
29de0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
29df0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
29e00 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
29e10 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
29e20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
29e30 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
29e40 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
29e50 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
29e60 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
29e70 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
29e80 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
29e90 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
29ea0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
29eb0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
29ec0 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
29ed0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
29ee0 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
29ef0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
29f00 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
29f10 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
29f20 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
29f30 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
29f40 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
29f50 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
29f60 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
29f70 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
29f80 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
29f90 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
29fa0 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
29fb0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
29fc0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
29fd0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
29fe0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63  const void *fetc
29ff0 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
2a000 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2a010 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
2a020 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
2a030 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
2a040 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20  32 *pAmt        
2a050 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2a060 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
2a070 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
2a080 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b  */.){.  u32 amt;
2a090 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
2a0a0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
2a0b0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
2a0c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a0d0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
2a0e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a0f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2a100 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a110 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2a120 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2a130 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
2a140 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2a150 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2a160 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
2a170 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
2a180 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a190 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
2a1a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a1b0 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a  info.nSize>0 );.
2a1c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a1d0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43  info.pPayload>pC
2a1e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a1f0 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c  >iPage]->aData |
2a200 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
2a210 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a220 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43  info.pPayload<pC
2a230 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a240 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e  >iPage]->aDataEn
2a250 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b  d ||CORRUPT_DB);
2a260 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70  .  amt = (int)(p
2a270 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a280 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45  ->iPage]->aDataE
2a290 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
2a2a0 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28  pPayload);.  if(
2a2b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2a2c0 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70  al<amt ) amt = p
2a2d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2a2e0 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b  ;.  *pAmt = amt;
2a2f0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
2a300 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  )pCur->info.pPay
2a310 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
2a320 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
2a330 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
2a340 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
2a350 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
2a360 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
2a370 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
2a380 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
2a390 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
2a3a0 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
2a3b0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
2a3c0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
2a3d0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
2a3e0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
2a3f0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
2a400 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
2a410 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
2a420 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
2a430 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
2a440 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
2a450 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
2a460 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
2a470 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
2a480 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
2a490 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
2a4a0 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
2a4b0 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
2a4c0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
2a4d0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
2a4e0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
2a4f0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
2a500 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
2a510 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
2a520 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
2a530 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
2a540 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2a550 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
2a560 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
2a570 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
2a580 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2a590 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
2a5a0 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
2a5b0 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63  pCur, pAmt);.}.c
2a5c0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
2a5d0 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
2a5e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2a5f0 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
2a600 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
2a610 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
2a620 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
2a630 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2a640 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2a650 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
2a660 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2a670 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
2a680 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
2a690 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
2a6a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a6b0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2a6c0 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
2a6d0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
2a6e0 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
2a6f0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2a700 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2a710 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
2a720 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
2a730 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
2a740 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
2a750 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
2a760 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
2a770 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
2a780 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
2a790 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
2a7a0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
2a7b0 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
2a7c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2a7d0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
2a7e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a7f0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2a800 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2a810 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a820 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2a830 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2a840 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
2a850 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
2a860 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2a870 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2a880 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
2a890 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
2a8a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a8b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a8c0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
2a8d0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2a8e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2a8f0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2a900 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2a910 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  l);.  pCur->iPag
2a920 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  e++;.  pCur->aiI
2a930 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2a940 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  = 0;.  return ge
2a950 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2a960 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72  , newPgno, &pCur
2a970 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a980 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2a9a0 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
2a9b0 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69  gerFlags);.}..#i
2a9c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2a9d0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
2a9e0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
2a9f0 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
2aa00 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
2aa10 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
2aa20 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2aa30 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2aa40 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
2aa50 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
2aa60 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
2aa70 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
2aa80 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
2aa90 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
2aaa0 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
2aab0 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
2aac0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2aad0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
2aae0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
2aaf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2ab00 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2ab10 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2ab20 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
2ab30 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
2ab40 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
2ab50 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
2ab60 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
2ab70 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
2ab80 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
2abb0 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
2abc0 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
2abd0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
2abe0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
2abf0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2ac00 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2ac10 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2ac20 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2ac30 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
2ac40 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
2ac50 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2ac60 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2ac70 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
2ac80 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
2ac90 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
2aca0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2acb0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
2acc0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2acd0 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
2ace0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
2acf0 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
2ad00 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
2ad10 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
2ad20 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
2ad30 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
2ad40 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2ad50 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
2ad60 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
2ad70 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
2ad80 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
2ad90 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2ada0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
2adb0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
2adc0 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
2add0 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
2ade0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
2adf0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
2ae00 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2ae10 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ae20 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ae30 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2ae40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ae50 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
2ae60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2ae70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ae80 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
2ae90 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
2aea0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2aeb0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
2aec0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2aed0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
2aee0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2aef0 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
2af00 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28    );.  testcase(
2af10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2af20 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
2af30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2af40 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
2af50 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2af60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2af70 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2af80 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2af90 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2afa0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
2afb0 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
2afc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2afd0 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  -]);.}../*.** Mo
2afe0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2aff0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2b000 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2b010 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2b020 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2b030 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2b040 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2b050 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2b060 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2b070 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2b080 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2b090 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2b0a0 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2b0b0 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2b0c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2b0d0 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2b0e0 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2b0f0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2b100 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2b110 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2b120 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2b130 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2b140 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2b150 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2b160 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2b170 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2b180 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2b190 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2b1a0 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
2b1b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
2b1c0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2b1d0 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
2b1e0 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
2b1f0 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
2b200 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
2b210 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
2b220 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
2b230 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
2b240 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
2b250 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
2b260 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
2b270 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2b280 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
2b290 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
2b2a0 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
2b2b0 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
2b2c0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
2b2d0 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
2b2e0 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
2b2f0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2b300 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
2b310 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
2b320 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
2b330 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2b340 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2b350 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
2b360 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
2b370 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
2b380 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
2b390 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
2b3a0 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
2b3b0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
2b3c0 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
2b3d0 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
2b3e0 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
2b3f0 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
2b400 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
2b410 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
2b420 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2b430 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
2b440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2b450 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2b460 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2b470 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2b480 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
2b490 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2b4a0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2b4b0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
2b4c0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2b4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2b4e0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
2b4f0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2b500 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2b510 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2b520 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
2b530 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2b540 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
2b550 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2b560 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2b570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2b580 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
2b590 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
2b5a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
2b5b0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
2b5c0 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
2b5d0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2b5e0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
2b5f0 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20  r->iPage ){.    
2b600 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b610 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b620 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ge]!=0 );.      
2b630 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2b640 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
2b650 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
2b660 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2b670 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
2b680 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
2b690 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2b6a0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
2b6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b6c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2b6d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2b6e0 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72  e==(-1) );.    r
2b6f0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2b700 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ge(pCur->pBtree-
2b710 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
2b720 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
2b730 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  age[0],.        
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b750 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  0, pCur->curPage
2b760 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  rFlags);.    if(
2b770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b780 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
2b790 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2b7a0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
2b7b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2b7c0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
2b7d0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
2b7e0 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61  IntKey = pCur->a
2b7f0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2b800 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
2b810 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2b820 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2b830 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
2b840 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
2b850 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
2b860 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
2b870 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
2b880 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
2b890 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
2b8a0 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
2b8b0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
2b8c0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
2b8d0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
2b8e0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
2b8f0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
2b900 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
2b910 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
2b920 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
2b930 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
2b940 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
2b950 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
2b960 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2b970 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
2b980 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
2b990 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
2b9a0 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
2b9b0 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
2b9c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2b9d0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
2b9e0 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
2b9f0 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
2ba00 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
2ba10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2ba20 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
2ba30 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
2ba40 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
2ba50 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
2ba60 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
2ba70 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
2ba80 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
2ba90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
2baa0 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
2bab0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
2bac0 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
2bad0 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
2bae0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2baf0 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
2bb00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2bb10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2bb20 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  PT;.  }..  pCur-
2bb30 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
2bb40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2bb50 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2bb60 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2bb70 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2bb80 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2bb90 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20  idOvfl);..  if( 
2bba0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
2bbb0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2bbc0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2bbd0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
2bbe0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
2bbf0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
2bc00 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
2bc10 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
2bc20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2bc30 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
2bc40 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
2bc50 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
2bc60 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2bc70 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2bc80 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2bc90 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2bca0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
2bcb0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
2bcc0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2bcd0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2bce0 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
2bcf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2bd00 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2bd10 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
2bd20 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
2bd30 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
2bd40 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
2bd50 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2bd60 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
2bd70 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
2bd80 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
2bd90 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
2bda0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
2bdb0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2bdc0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2bdd0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2bde0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2bdf0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
2be00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2be10 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2be20 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2be30 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2be40 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2be50 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2be60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2be70 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
2be80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
2be90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2bea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2beb0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
2bec0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2bed0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
2bee0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2bef0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2bf00 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2bf10 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
2bf20 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
2bf30 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2bf40 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
2bf50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2bf60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2bf70 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2bf80 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
2bf90 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
2bfa0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
2bfb0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
2bfc0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2bfd0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
2bfe0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
2bff0 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
2c000 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
2c010 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
2c020 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2c030 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
2c040 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
2c050 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
2c060 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
2c070 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
2c080 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
2c090 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
2c0a0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
2c0b0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
2c0c0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
2c0d0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
2c0e0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
2c0f0 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
2c100 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
2c110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2c120 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
2c130 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2c140 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2c150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c160 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c170 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
2c180 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2c190 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2c1a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2c1b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2c1c0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
2c1d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2c1e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2c1f0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
2c200 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
2c210 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2c220 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2c230 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
2c240 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2c250 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
2c260 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2c270 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
2c280 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2c290 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2c2a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c2b0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
2c2c0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73  ->nCell-1;.  ass
2c2d0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2c2e0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73  nSize==0 );.  as
2c2f0 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2c300 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2c310 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20  idNKey)==0 );.  
2c320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c330 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2c340 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
2c350 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
2c360 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2c370 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
2c380 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
2c390 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
2c3a0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
2c3b0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
2c3c0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
2c3d0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
2c3e0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2c3f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c400 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
2c410 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2c420 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2c430 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2c440 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2c450 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c470 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2c480 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2c490 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2c4a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2c4b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c4c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2c4d0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2c4e0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
2c4f0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2c500 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2c510 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2c520 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2c530 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2c540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c550 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c560 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c570 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
2c580 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c590 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2c5a0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2c5b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2c5c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2c5d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2c5e0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2c5f0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2c600 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2c610 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2c620 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2c630 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2c640 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2c650 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2c660 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2c670 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c680 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2c690 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
2c6a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2c6b0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2c6c0 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
2c6d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2c6e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2c6f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2c700 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2c710 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2c720 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2c730 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
2c740 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
2c750 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
2c760 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
2c770 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
2c780 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
2c790 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2c7a0 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2c7b0 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  !=0 ){.#ifdef SQ
2c7c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
2c7d0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
2c7e0 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
2c7f0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2c800 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
2c810 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
2c820 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2c830 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
2c840 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
2c850 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
2c860 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
2c870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2c880 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
2c890 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
2c8a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
2c8b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c8c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c8d0 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
2c8e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2c8f0 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
2c900 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2c910 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2c920 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
2c930 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c940 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
2c950 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2c960 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2c970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c980 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2c990 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2c9a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2c9b0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2c9c0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2c9d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2c9e0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2c9f0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2ca00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ca10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ca20 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2ca30 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
2ca40 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
2ca50 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2ca60 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69  t(pCur);.      i
2ca70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ca80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2ca90 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2caa0 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
2cab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2cac0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2cad0 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2cae0 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20        }.   .    
2caf0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2cb00 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2cb10 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
2cb20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
2cb30 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
2cb40 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
2cb50 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
2cb60 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
2cb70 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
2cb80 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
2cb90 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
2cba0 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
2cbb0 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
2cbc0 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
2cbd0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
2cbe0 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
2cbf0 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
2cc00 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
2cc10 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
2cc20 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
2cc30 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
2cc40 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
2cc50 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
2cc60 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
2cc70 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
2cc80 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
2cc90 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
2cca0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
2ccb0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
2ccc0 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
2ccd0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
2cce0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
2ccf0 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
2cd00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
2cd10 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
2cd20 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
2cd30 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
2cd40 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
2cd50 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
2cd60 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
2cd70 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
2cd80 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
2cd90 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2cda0 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
2cdb0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
2cdc0 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
2cdd0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2cde0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2cdf0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2ce10 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
2ce20 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
2ce30 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2ce40 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
2ce50 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
2ce60 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
2ce70 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
2ce80 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
2ce90 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
2cea0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2ceb0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2cec0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2ced0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2cee0 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
2cef0 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
2cf00 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
2cf10 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
2cf20 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2cf30 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2cf40 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
2cf60 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
2cf70 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f  y/pIdxKey..**.*/
2cf80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2cf90 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
2cfa0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2cfb0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
2cfc0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
2cfd0 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
2cfe0 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
2cff0 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
2d000 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
2d010 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
2d020 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2d030 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
2d040 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
2d050 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2d060 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
2d070 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
2d080 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
2d090 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2d0a0 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
2d0b0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2d0c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2d0d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52  RecordCompare xR
2d0e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20  ecordCompare;.. 
2d0f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2d100 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2d110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2d120 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d130 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2d140 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2d150 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2d160 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2d170 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2d180 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
2d190 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2d1a0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
2d1b0 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
2d1c0 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
2d1d0 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
2d1e0 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
2d1f0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2d200 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
2d210 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2d220 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
2d230 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2d240 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2d250 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75  ey)!=0.   && pCu
2d260 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20 20  r->curIntKey .  
2d270 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2d280 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2d290 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2d2a0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
2d2b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d2c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43     }.    if( (pC
2d2d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2d2e0 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26  TCF_AtLast)!=0 &
2d2f0 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
2d300 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2d310 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2d320 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d330 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2d340 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
2d350 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2d360 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
2d370 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
2d380 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
2d390 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  Key->errCode = 0
2d3a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
2d3b0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2d3c0 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
2d3d0 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2d3e0 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
2d3f0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2d400 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
2d410 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2d420 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2d430 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
2d440 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
2d450 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
2d460 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2d470 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2d490 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2d4a0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2d4b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d4c0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
2d4d0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2d4e0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2d4f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d500 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
2d510 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d520 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2d530 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61  VALID || pCur->a
2d540 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2d550 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
2d560 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2d570 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2d580 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
2d590 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
2d5a0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2d5b0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2d5c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2d5d0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2d5e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d5f0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
2d600 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2d610 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e  ->intKey==pCur->
2d620 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61  curIntKey );.  a
2d630 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
2d640 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  IntKey || pIdxKe
2d650 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
2d660 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
2d670 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
2d680 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
2d690 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2d6a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d6b0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75  r->iPage];.    u
2d6c0 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
2d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d6f0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
2d700 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
2d710 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
2d720 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
2d730 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
2d740 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
2d750 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
2d760 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
2d770 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
2d780 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
2d790 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
2d7a0 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
2d7b0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
2d7c0 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
2d7d0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
2d7e0 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
2d7f0 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
2d800 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
2d810 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
2d820 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
2d830 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
2d840 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
2d850 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
2d860 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
2d870 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
2d880 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
2d890 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
2d8a0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
2d8b0 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
2d8c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2d8d0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2d8e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d8f0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
2d900 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
2d910 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
2d920 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2d930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
2d940 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
2d950 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
2d960 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
2d970 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
2d980 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
2d990 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
2d9a0 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
2d9b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d9c0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2d9d0 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43      if( xRecordC
2d9e0 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
2d9f0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2da00 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
2da10 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
2da20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2da30 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  r(pPage, idx);. 
2da40 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2da50 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
2da60 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2da70 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
2da80 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
2da90 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
2daa0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20  age->aDataEnd ) 
2dab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2dac0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2dad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dae0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
2daf0 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
2db00 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
2db10 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
2db20 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2db30 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2db40 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2db50 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2db60 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
2db70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
2db80 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
2db90 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2dba0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2dbb0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2dbc0 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
2dbd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2dbe0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2dbf0 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
2dc00 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
2dc10 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2dc20 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
2dc30 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
2dc40 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2dc50 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2dc60 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2dc70 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2dc80 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2dc90 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2dca0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2dcb0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
2dcc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2dcd0 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2dce0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2dcf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e{.            *
2dd00 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2dd10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2dd20 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2dd30 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2dd40 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2dd50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2dd60 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2dd70 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2dd80 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2dd90 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2dda0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2ddb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2ddc0 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
2ddd0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
2dde0 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ell;  /* Size of
2ddf0 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20   the pCell cell 
2de00 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2de10 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2de20 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2de30 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  e, idx);..      
2de40 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2de50 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
2de60 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
2de70 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
2de80 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2de90 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2dea0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
2deb0 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
2dec0 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
2ded0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
2dee0 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
2def0 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
2df00 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
2df10 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
2df20 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
2df30 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
2df40 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
2df50 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
2df60 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
2df70 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
2df80 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
2df90 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
2dfa0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
2dfb0 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
2dfc0 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
2dfd0 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
2dfe0 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
2dff0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
2e000 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
2e010 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e020 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
2e030 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
2e040 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
2e050 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
2e060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2e070 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
2e080 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
2e090 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
2e0a0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
2e0b0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
2e0c0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2e0d0 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
2e0e0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2e0f0 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
2e100 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2e110 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2e120 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2e130 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
2e140 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2e150 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2e160 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2e170 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
2e180 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2e190 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
2e1a0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
2e1b0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
2e1c0 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
2e1d0 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
2e1e0 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
2e1f0 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
2e200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e210 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2e220 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
2e230 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2e240 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
2e250 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
2e260 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
2e270 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2e280 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2e290 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
2e2a0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2e2b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2e2c0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2e2d0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2e2e0 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
2e2f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e300 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2e310 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
2e320 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
2e330 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2e340 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
2e350 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
2e360 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
2e370 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
2e380 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
2e390 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
2e3a0 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
2e3b0 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
2e3c0 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
2e3d0 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
2e3e0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
2e3f0 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
2e400 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
2e410 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
2e420 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e430 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
2e440 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
2e450 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
2e460 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
2e470 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
2e480 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
2e490 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
2e4a0 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
2e4b0 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
2e4c0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
2e4d0 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
2e4e0 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
2e4f0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
2e500 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
2e510 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
2e520 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2e530 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
2e540 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
2e550 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
2e560 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
2e570 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2e580 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
2e590 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
2e5a0 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2e5b0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2e5c0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2e5d0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2e5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2e5f0 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2e600 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
2e610 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
2e620 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
2e630 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2e640 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
2e650 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2e660 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
2e670 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2e680 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
2e690 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2e6a0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2e6b0 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
2e6c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e6d0 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
2e6e0 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
2e6f0 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
2e700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
2e710 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
2e720 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e730 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2e740 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e750 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e770 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
2e780 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
2e790 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20  Cell+18 );.     
2e7a0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2e7b0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2e7c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e7d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
2e7e0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2e7f0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2e800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
2e810 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e820 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2e830 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2e840 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2e850 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
2e860 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
2e870 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20  CellKey, 2);.   
2e880 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2e890 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2e8a0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2e8b0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
2e8c0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2e8d0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2e8e0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2e8f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2e900 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
2e910 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2e920 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e930 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2e940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2e950 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
2e960 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
2e970 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
2e980 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
2e990 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
2e9a0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2e9b0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
2e9c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
2e9d0 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
2e9e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
2e9f0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
2ea00 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2ea10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2ea20 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
2ea30 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2ea40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2ea50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ea60 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
2ea70 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2ea80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2ea90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2eaa0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2eab0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2eac0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2ead0 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
2eae0 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
2eaf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
2eb00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2eb10 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2eb20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2eb30 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
2eb40 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
2eb50 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2eb60 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2eb70 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2eb80 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2eb90 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
2eba0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2ebb0 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
2ebc0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2ebd0 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
2ebe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ebf0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2ec00 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2ec10 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
2ec20 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
2ec30 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
2ec40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ec50 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
2ec60 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2ec70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2ec80 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2ec90 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
2eca0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2ecb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
2ecc0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2ecd0 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
2ece0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
2ecf0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2ed00 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2ed10 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ed20 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ed30 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2ed40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2ed50 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2ed60 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2ed70 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
2ed80 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2ed90 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2eda0 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
2edb0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2edc0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
2edd0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2ede0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
2edf0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
2ee00 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2ee10 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2ee20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2ee30 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2ee40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ee50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2ee60 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
2ee70 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
2ee80 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
2ee90 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2eea0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
2eeb0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
2eec0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
2eed0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
2eee0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
2eef0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2ef00 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
2ef10 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
2ef20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
2ef30 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
2ef40 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
2ef50 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2ef60 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2ef70 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
2ef80 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2ef90 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
2efa0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2efb0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
2efc0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
2efd0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
2efe0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
2eff0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
2f000 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
2f010 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
2f020 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
2f030 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
2f040 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
2f050 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
2f060 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
2f070 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
2f080 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2f090 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2f0a0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2f0b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2f0c0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2f0d0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2f0e0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2f0f0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2f100 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2f110 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2f120 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2f130 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2f140 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2f150 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2f160 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2f170 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2f180 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2f190 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2f1a0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2f1b0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2f1c0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2f1d0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2f1e0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2f1f0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2f200 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2f210 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2f220 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2f230 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2f240 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2f250 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2f260 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2f270 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2f280 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2f290 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2f2a0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2f2b0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2f2c0 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2f2d0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2f2e0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2f2f0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2f300 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2f310 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2f320 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2f330 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2f340 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2f350 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2f360 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2f370 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2f380 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2f390 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2f3a0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2f3b0 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2f3c0 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2f3d0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2f3e0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2f3f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2f400 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2f410 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2f420 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2f430 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2f440 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2f450 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2f460 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2f470 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2f480 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2f490 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2f4a0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2f4b0 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2f4c0 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2f4d0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2f4e0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2f4f0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2f500 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2f510 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2f520 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2f530 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2f540 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2f550 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2f560 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f570 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2f580 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2f590 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2f5a0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2f5b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2f5c0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f5d0 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2f5e0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2f5f0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2f600 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2f610 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2f620 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2f630 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f650 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f660 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2f670 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2f680 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2f690 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2f6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f6b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2f6c0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2f6d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2f6e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2f6f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2f700 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2f710 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2f720 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2f730 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2f740 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2f750 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
2f760 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2f770 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2f780 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f790 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2f7a0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2f7b0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2f7c0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2f7d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2f7e0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
2f7f0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
2f800 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2f810 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2f820 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
2f830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f840 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
2f850 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
2f860 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
2f870 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
2f880 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
2f890 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
2f8a0 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
2f8b0 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
2f8c0 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
2f8d0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
2f8e0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
2f8f0 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
2f900 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
2f910 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
2f920 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
2f930 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
2f940 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
2f950 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
2f960 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
2f970 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
2f980 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
2f990 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2f9a0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
2f9b0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2f9c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2f9d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
2f9e0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2f9f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2fa00 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2fa10 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2fa20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2fa30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
2fa40 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2fa50 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2fa60 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
2fa70 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2fa80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2fa90 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
2faa0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2fab0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2fac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2fad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2fae0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2faf0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2fb00 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2fb10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2fb20 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
2fb30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2fb40 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
2fb50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2fb60 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2fb70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fb80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2fb90 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2fba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fbb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fbc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2fbd0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2fbe0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2fbf0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2fc00 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2fc10 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2fc20 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
2fc30 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
2fc40 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2fc50 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
2fc60 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
2fc70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2fc80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2fc90 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2fca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2fcb0 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
2fcc0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2fcd0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2fce0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2fcf0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2fd00 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2fd10 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2fd20 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2fd30 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2fd40 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2fd50 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
2fd60 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2fd70 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
2fd80 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2fd90 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2fda0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2fdb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2fdc0 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  ];.  if( (++pCur
2fdd0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2fde0 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  age])>=pPage->nC
2fdf0 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
2fe00 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2fe10 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  ge]--;.    retur
2fe20 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2fe30 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69  , pRes);.  }.  i
2fe40 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2fe50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2fe60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2fe70 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2fe80 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2fe90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2fea0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
2feb0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
2fec0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
2fed0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fee0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
2fef0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
2ff00 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
2ff10 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
2ff20 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
2ff30 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2ff40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2ff50 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
2ff60 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
2ff70 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
2ff80 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
2ff90 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2ffa0 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
2ffb0 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
2ffc0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2ffd0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2ffe0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2fff0 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
30000 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
30010 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
30020 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
30030 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
30040 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
30050 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
30060 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a  treePrevious().*
30070 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  * helper routine
30080 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
30090 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
300a0 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
300b0 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f  ferent page.** o
300c0 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  r to restore the
300d0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
300e0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
300f0 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
30100 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
30110 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
30120 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
30130 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
30140 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
30150 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
30160 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
30170 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
30180 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
30190 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
301a0 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
301b0 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
301c0 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
301d0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
301e0 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
301f0 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
30200 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
30210 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
30220 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
30230 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
30240 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
30250 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
30260 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
30270 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
30280 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
30290 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
302a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
302b0 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
302c0 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
302d0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
302e0 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
302f0 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
30300 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
30310 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
30320 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  btreePrevious(Bt
30330 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
30340 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
30350 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
30360 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
30370 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
30380 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
30390 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
303a0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
303b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
303c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
303d0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
303e0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
303f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
30400 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
30410 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
30420 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
30430 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
30440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
30450 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
30460 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
30470 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
30480 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
30490 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
304a0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
304b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
304c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
304d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
304e0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
304f0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
30500 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
30510 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
30520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30530 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
30540 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
30550 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
30560 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
30570 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
30580 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
30590 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
305a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
305b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
305c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
305d0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
305e0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
305f0 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
30600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30620 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
30630 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
30640 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
30650 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
30660 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
30670 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
30680 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30690 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
306a0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
306b0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
306c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
306d0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
306e0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
306f0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
30700 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30710 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
30720 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
30730 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
30740 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
30750 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
30760 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
30770 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
30780 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
30790 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
307a0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
307b0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
307c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
307d0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
307e0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
307f0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
30800 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
30810 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
30820 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
30830 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
30840 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
30850 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
30860 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   );..    pCur->a
30870 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
30880 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
30890 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
308a0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
308b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
308c0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
308d0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
308e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
308f0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
30900 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30910 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
30920 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
30930 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
30940 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
30950 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
30960 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
30970 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
30980 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
30990 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
309a0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
309b0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
309c0 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
309d0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
309e0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
309f0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
30a00 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73  VALID );.  *pRes
30a10 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
30a20 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
30a30 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
30a40 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
30a50 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
30a60 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
30a70 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
30a80 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
30a90 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49  .   || pCur->aiI
30aa0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
30ab0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
30ac0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
30ad0 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
30ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
30af0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
30b00 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pRes);.  }.  pCu
30b10 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
30b20 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72  Page]--;.  retur
30b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30b40 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
30b50 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
30b60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30b70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
30b80 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
30b90 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
30ba0 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
30bb0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
30bc0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
30bd0 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
30be0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
30bf0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
30c00 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
30c10 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
30c20 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
30c30 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
30c40 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
30c50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
30c60 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
30c70 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
30c80 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
30c90 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
30ca0 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
30cb0 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
30cc0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
30cd0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
30ce0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
30cf0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
30d00 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
30d10 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
30d20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
30d30 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
30d40 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
30d50 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
30d60 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
30d70 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
30d80 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
30d90 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
30da0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
30db0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
30dc0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
30dd0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30de0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
30df0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
30e00 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
30e10 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
30e20 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
30e30 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
30e40 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
30e50 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
30e60 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
30e70 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
30e80 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
30e90 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
30ea0 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
30eb0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
30ec0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
30ed0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
30ee0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
30ef0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
30f00 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
30f10 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
30f20 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
30f30 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
30f40 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
30f50 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
30f60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
30f70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
30f80 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
30f90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
30fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
30fb0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
30fc0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
30fd0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
30fe0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
30ff0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
31000 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
31010 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
31020 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
31030 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
31040 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
31050 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
31060 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
31070 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
31080 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
31090 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
310a0 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
310b0 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
310c0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
310d0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
310e0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
310f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
31100 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
31110 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
31120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
31130 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
31140 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
31150 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
31160 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
31170 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
31180 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
31190 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
311a0 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
311b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
311c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
311d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
311e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
311f0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
31200 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
31210 65 61 72 62 79 3e 30 20 26 26 20 52 45 51 55 49  earby>0 && REQUI
31220 52 45 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20  RE_PTRMAP ) );. 
31230 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
31240 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
31250 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
31260 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44  (pBt);.  /* EVID
31270 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39  ENCE-OF: R-05119
31280 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74  -02637 The 4-byt
31290 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
312a0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
312b0 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74  6.  ** stores st
312c0 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ores the total n
312d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
312e0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
312f0 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  */.  n = get4byt
31300 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
31310 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
31320 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
31330 3b 0a 20 20 69 66 28 20 49 53 43 4f 4e 43 55 52  ;.  if( ISCONCUR
31340 52 45 4e 54 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78  RENT==0 && n>=mx
31350 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
31360 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
31370 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
31380 2a 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20  * Ensure page 1 
31390 69 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69  is writable. Thi
313a0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
313b0 65 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68  either change th
313c0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
313d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72   pages in the fr
313e0 65 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73  ee-list or the s
313f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
31400 61 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20  ase file. Since 
31410 62 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  both.  ** of the
31420 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  se operations in
31430 76 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20  volve modifying 
31440 70 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69  page 1 header fi
31450 65 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a  elds, page 1.  *
31460 2a 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c  * will definitel
31470 79 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20  y be written by 
31480 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
31490 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
314a0 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20  CONCURRENT.  ** 
314b0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73  transaction, ens
314c0 75 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72  ure the BtreePtr
314d0 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61  map structure ha
314e0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
314f0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
31500 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31510 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
31520 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
31530 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e  rn rc;..  if( n>
31540 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
31550 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
31560 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
31570 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
31580 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
31590 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
315a0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
315b0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
315c0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
315d0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
315e0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
315f0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
31600 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
31610 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
31620 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
31630 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
31640 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
31650 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
31660 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
31670 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
31680 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
31690 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
316a0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
316b0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
316c0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
316d0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
316e0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
316f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f    */.    if( eMo
31700 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31710 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
31720 74 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21  t( ISAUTOVACUUM!
31730 3d 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b  =ISCONCURRENT );
31740 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
31750 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
31760 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
31770 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
31780 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
31790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
317a0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
317b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
317c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
317d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
317e0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
317f0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
31800 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31810 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31820 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54            if( eT
31830 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
31840 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
31850 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
31860 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
31870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
31890 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
318a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
318b0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
318c0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
318d0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
318e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
318f0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
31900 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
31910 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
31920 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
31930 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
31940 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
31950 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
31960 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
31970 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79     */.    put4by
31980 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31990 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
319a0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
319b0 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
319c0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
319d0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
319e0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
319f0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
31a00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
31a10 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
31a20 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
31a30 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
31a40 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
31a50 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
31a60 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
31a70 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
31a80 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
31a90 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
31aa0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
31ab0 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
31ac0 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
31ad0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
31ae0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
31af0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
31b00 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
31b10 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
31b20 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
31b30 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
31b40 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
31b50 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
31b60 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
31b70 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
31b80 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
31b90 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
31ba0 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
31bb0 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
31bc0 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
31bd0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
31be0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
31bf0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
31c00 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
31c10 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
31c20 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
31c30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
31c40 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
31c50 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
31c60 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
31c70 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
31c80 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
31c90 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
31ca0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
31cb0 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
31cc0 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
31cd0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
31ce0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
31cf0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
31d00 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
31d10 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
31d20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
31d30 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
31d40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
31d50 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
31d60 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
31d70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31d80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31d90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31da0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
31db0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
31dc0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
31dd0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
31de0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
31df0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
31e00 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
31e10 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31e20 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
31e30 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
31e40 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
31e50 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
31e60 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
31e70 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
31e80 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
31e90 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
31ea0 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
31eb0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
31ec0 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
31ed0 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
31ee0 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
31ef0 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
31f00 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
31f10 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
31f20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
31f30 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
31f40 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
31f50 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
31f60 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
31f70 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
31f80 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
31f90 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
31fa0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
31fb0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
31fc0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
31fd0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
31fe0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
31ff0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
32000 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
32010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32020 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
32030 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
32040 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
32050 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32060 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
32080 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
32090 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
320a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
320b0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
320c0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
320d0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
320e0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
320f0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
32100 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
32110 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
32120 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
32130 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
32140 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
32150 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
32160 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
32170 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
32180 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
32190 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
321a0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
321b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
321c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
321d0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
321e0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
321f0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
32200 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32210 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
32220 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a  if( searchList .
32230 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
32240 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c  nearby==iTrunk |
32250 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79  | (iTrunk<nearby
32260 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
32270 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29  OC_LE)) .      )
32280 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
32290 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
322a0 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
322b0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
322c0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
322d0 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
322e0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
322f0 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
32300 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
32310 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
32320 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
32330 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
32340 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
32350 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
32360 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32370 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
32380 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32390 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
323a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
323b0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
323c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
323d0 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
323e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
323f0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
32400 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32410 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32420 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
32430 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
32440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32460 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
32470 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
32480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
32490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
324a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
324b0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
324c0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
324d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
324e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
324f0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
32500 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
32510 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
32520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
32530 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
32540 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
32550 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
32560 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
32570 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
32580 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
32590 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
325a0 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
325b0 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
325c0 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
325d0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
325e0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
325f0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
32600 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
32610 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
32620 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
32630 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
32640 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
32650 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
32660 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
32670 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32680 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
32690 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
326a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
326b0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
326c0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
326d0 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
326e0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
326f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
32700 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
32710 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
32720 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
32730 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32750 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32760 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
32770 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32780 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32790 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
327a0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
327b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
327c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
327d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
327e0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
327f0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
32800 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32810 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32820 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
32830 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
32840 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
32850 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
32860 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
32870 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
32880 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
32890 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
328a0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
328b0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
328c0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
328d0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
328e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
328f0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
32900 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
32910 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
32920 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32930 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
32940 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
32950 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
32960 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
32970 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
32980 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
32990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
329a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
329b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
329c0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
329d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
329e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
329f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32a00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32a10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32a20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
32a30 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
32a40 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
32a50 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
32a60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32a70 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
32a80 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
32a90 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
32aa0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
32ab0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
32ac0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
32ad0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
32ae0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
32af0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
32b00 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
32b10 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
32b20 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
32b30 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
32b40 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
32b50 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
32b60 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
32b70 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
32b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
32b90 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
32ba0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
32bb0 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
32bc0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
32bd0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
32be0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
32bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
32c00 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
32c10 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
32c20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32c30 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
32c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32c50 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
32c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
32c70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
32c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
32c90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
32ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
32cb0 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
32cc0 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
32cd0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
32ce0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
32cf0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
32d00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
32d10 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
32d20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
32d30 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
32d40 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
32d50 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
32d60 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
32d70 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
32d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32d90 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
32da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32db0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
32dc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32dd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32de0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
32df0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
32e00 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
32e10 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
32e20 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
32e30 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
32e40 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
32e50 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
32e60 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
32e70 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
32e80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
32e90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32ea0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
32eb0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32ec0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32ed0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
32ee0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
32ef0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
32f00 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
32f10 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
32f20 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
32f30 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
32f40 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
32f50 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
32f60 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
32f70 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
32f80 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
32f90 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
32fa0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
32fb0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
32fc0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
32fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fe0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
32ff0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
33000 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
33010 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
33020 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
33030 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
33040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33050 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
33060 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
33070 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
33080 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
33090 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
330a0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
330b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
330c0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
330d0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
330e0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
330f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33100 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
33110 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
33120 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
33130 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
33140 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
33150 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
33160 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
33170 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
33180 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
33190 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
331a0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
331b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
331c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
331d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
331e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
331f0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
33200 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
33210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33230 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
33240 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
33250 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61             *ppPa
33260 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
33270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
33280 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
33290 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
332a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
332b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
332c0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
332d0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
332e0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
332f0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
33300 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
33310 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
33320 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
33330 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
33340 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
33350 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
33360 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
33370 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
33380 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
33390 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
333a0 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
333b0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
333c0 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
333d0 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
333e0 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
333f0 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
33400 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
33410 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
33420 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
33430 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
33440 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
33450 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
33460 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
33470 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
33480 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
33490 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
334a0 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
334b0 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
334c0 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
334d0 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
334e0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
334f0 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
33500 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
33510 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
33520 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
33530 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
33540 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
33550 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
33560 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
33570 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
33580 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
33590 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
335a0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
335b0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
335c0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
335d0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
335e0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
335f0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
33600 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
33610 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
33620 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
33630 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
33640 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
33650 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
33660 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
33670 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
33680 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
33690 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
336a0 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
336b0 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
336c0 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
336d0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
336e0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
336f0 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
33700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
33710 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
33720 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
33730 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
33740 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
33750 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
33760 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72  ONTENT:0;..    r
33770 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33780 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
33790 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
337a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
337b0 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
337c0 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
337d0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
337e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
337f0 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
33800 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
33810 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33820 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
33830 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
33840 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
33850 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
33860 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
33870 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
33880 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
33890 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
338a0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
338b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
338c0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
338d0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
338e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
338f0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
33900 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
33910 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
33920 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
33930 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
33940 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
33950 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
33960 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
33970 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
33980 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
33990 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
339a0 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
339b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
339c0 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
339d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
339e0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
339f0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
33a00 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
33a10 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  &pPg, bNoContent
33a20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
33a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33a40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33a50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
33a60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33a70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33a80 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
33a90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33aa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42  urn rc;.      pB
33ab0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
33ac0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
33ad0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
33ae0 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d  AGE(pBt) ){ pBt-
33af0 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20  >nPage++; }.    
33b00 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74  }.#endif.    put
33b10 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29  4byte(28 + (u8*)
33b20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
33b30 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ta, pBt->nPage);
33b40 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42  .    *pPgno = pB
33b50 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61  t->nPage;..    a
33b60 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
33b70 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33b80 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
33b90 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
33ba0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
33bb0 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e  , ppPage, bNoCon
33bc0 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  tent);.    if( r
33bd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
33be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33bf0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
33c00 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
33c10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33c20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
33c30 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
33c40 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67  e);.      *ppPag
33c50 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
33c60 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
33c70 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
33c80 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
33c90 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
33ca0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
33cb0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33cc0 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
33cd0 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
33ce0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
33cf0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
33d00 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73  PrevTrunk);.  as
33d10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
33d20 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
33d30 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
33d40 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
33d50 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65  ge)<=1 );.  asse
33d60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
33d70 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  K || (*ppPage)->
33d80 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
33d90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33da0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33db0 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
33dc0 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
33dd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33de0 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
33df0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
33e00 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
33e10 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
33e20 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
33e30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
33e40 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
33e50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
33e60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
33e70 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
33e80 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
33e90 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
33ea0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
33eb0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
33ec0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
33ed0 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
33ee0 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
33ef0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
33f00 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
33f10 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
33f20 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
33f30 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
33f40 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
33f50 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
33f60 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
33f70 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
33f80 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
33f90 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
33fa0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
33fb0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
33fc0 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
33fd0 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
33fe0 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
33ff0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
34000 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
34010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
34020 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34030 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
34040 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
34050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
34060 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
34070 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34080 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
34090 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
340a0 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
340b0 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
340c0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
340d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
340e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340f0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
34100 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
34110 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34140 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
34150 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
34160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34170 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
34180 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34190 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
341a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
341b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
341c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
341d0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
341e0 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a  B || iPage>1 );.
341f0 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
34200 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
34210 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
34220 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29  .  if( iPage<2 )
34230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
34240 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69  ORRUPT_BKPT;.  i
34250 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
34260 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
34270 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
34280 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
34290 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
342a0 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
342b0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
342c0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
342d0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
342e0 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
342f0 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
34300 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
34310 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
34320 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
34330 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
34340 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
34350 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
34360 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
34370 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
34380 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
34390 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
343a0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
343b0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
343c0 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
343d0 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
343e0 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
343f0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
34400 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
34410 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
34420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
34430 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
34440 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
34450 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
34460 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
34470 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
34480 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
34490 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
344a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
344b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
344c0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
344d0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
344e0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
344f0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
34500 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
34510 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
34520 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
34530 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
34540 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
34550 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
34560 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
34570 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
34580 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
34590 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
345a0 69 66 28 20 52 45 51 55 49 52 45 5f 50 54 52 4d  if( REQUIRE_PTRM
345b0 41 50 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  AP ){.    ptrmap
345c0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
345d0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
345e0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
345f0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
34600 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
34610 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
34620 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
34630 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
34640 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
34650 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
34660 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
34670 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
34680 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
34690 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
346a0 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
346b0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
346c0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
346d0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
346e0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
346f0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
34700 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
34710 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
34720 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
34730 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
34740 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
34750 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
34760 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
34770 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
34780 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
34790 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
347a0 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
347b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
347c0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
347d0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
347e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
347f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
34800 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
34810 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
34820 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
34830 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
34840 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
34850 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
34860 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
34870 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
34880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34890 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
348a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
348b0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
348c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
348d0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
348e0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
348f0 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
34900 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
34910 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
34920 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
34930 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34940 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
34950 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
34960 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
34970 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
34980 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
34990 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
349a0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
349b0 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
349c0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
349d0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
349e0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
349f0 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
34a00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
34a10 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
34a20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
34a30 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
34a40 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
34a50 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
34a60 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
34a70 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
34a80 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
34a90 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
34aa0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
34ab0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
34ac0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
34ad0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
34ae0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
34af0 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
34b00 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
34b10 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
34b20 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
34b30 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
34b40 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
34b50 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
34b60 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
34b70 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
34b80 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
34b90 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
34ba0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
34bb0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
34bc0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
34bd0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
34be0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
34bf0 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
34c00 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
34c10 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
34c20 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
34c30 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
34c40 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
34c50 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
34c60 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
34c70 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
34c80 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
34c90 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
34ca0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
34cb0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
34cc0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
34cd0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
34ce0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  4-8"..      **. 
34cf0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
34d00 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35  -OF: R-19920-115
34d10 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65  76 However, newe
34d20 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
34d30 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20  Lite still.     
34d40 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20   ** avoid using 
34d50 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74  the last six ent
34d60 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ries in the free
34d70 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
34d80 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a  array in.      *
34d90 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74  * order that dat
34da0 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
34db0 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  ted by newer ver
34dc0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
34dd0 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
34de0 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65  read by older ve
34df0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
34e00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34e20 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
34e30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34e50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
34e60 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
34e70 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
34e80 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
34e90 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
34ea0 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
34eb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
34ec0 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
34ed0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
34ee0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
34ef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
34f00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
34f10 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
34f20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
34f30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
34f40 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
34f50 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
34f60 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
34f70 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
34f80 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
34f90 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
34fa0 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
34fb0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
34fc0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34fd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34fe0 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
34ff0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
35000 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
35010 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
35020 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
35030 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
35040 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
35050 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
35060 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
35070 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
35080 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
35090 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
350a0 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
350b0 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
350c0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
350d0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
350e0 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
350f0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
35100 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
35110 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
35120 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
35130 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
35140 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
35150 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
35160 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
35170 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
35180 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
35190 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
351a0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
351b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
351c0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
351d0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
351e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
351f0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
35200 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
35210 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
35220 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
35230 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
35240 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
35250 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
35260 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
35270 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
35280 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
35290 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
352a0 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
352b0 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
352c0 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
352d0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
352e0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
352f0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
35300 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
35310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
35320 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
35330 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
35340 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
35350 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
35360 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
35370 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
35380 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
35390 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
353a0 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
353b0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
353c0 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
353d0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
353e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
353f0 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69  given Cell.  Wri
35400 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  te the.** local 
35410 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e  Cell size (the n
35420 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
35430 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  n the original p
35440 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a  age, omitting.**
35450 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20   overflow) into 
35460 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  *pnSize..*/.stat
35470 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
35480 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
35490 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
354a0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
354b0 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
354c0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
354d0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
354e0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
354f0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36  he Cell */.  u16
35500 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
35510 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
35520 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43  he size of the C
35530 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ell here */.){. 
35540 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
35550 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
35560 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
35570 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
35580 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
35590 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
355a0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
355b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
355c0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
355d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
355e0 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
355f0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
35600 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a  &info);.  *pnSiz
35610 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
35620 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
35630 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
35640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35650 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
35660 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
35670 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
35680 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
35690 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  f( pCell+info.iO
356a0 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67  verflow+3 > pPag
356b0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
356c0 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
356d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
356e0 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20  RRUPT_BKPT;  /* 
356f0 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
35700 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
35710 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
35720 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
35730 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
35740 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
35750 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
35760 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
35770 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
35780 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
35790 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
357a0 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
357b0 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
357c0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
357d0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
357e0 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
357f0 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 69 6e  ORRUPT_DB && (in
35800 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76  fo.nPayload + ov
35810 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c  flPageSize)<ovfl
35820 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20  PageSize).  );. 
35830 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
35840 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
35850 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
35860 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
35870 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
35880 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
35890 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
358a0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
358b0 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
358c0 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
358d0 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
358e0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
358f0 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
35900 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
35910 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
35920 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
35930 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
35940 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
35950 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
35960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35970 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
35980 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
35990 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
359a0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
359b0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
359c0 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
359d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
359e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
359f0 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
35a00 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
35a10 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
35a20 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
35a30 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
35a40 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
35a50 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
35a60 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
35a70 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
35a80 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
35a90 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
35aa0 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
35ab0 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
35ac0 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
35ad0 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
35ae0 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
35af0 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
35b00 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
35b10 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
35b20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
35b30 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
35b40 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
35b50 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
35b60 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
35b70 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
35b80 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
35b90 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
35ba0 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
35bb0 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
35bc0 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
35bd0 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
35be0 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
35bf0 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
35c00 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
35c10 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
35c20 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
35c30 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
35c40 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
35c50 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
35c60 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
35c70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
35c80 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
35c90 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
35ca0 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
35cb0 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
35cc0 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
35cd0 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
35ce0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
35cf0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
35d00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
35d10 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
35d20 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
35d30 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
35d40 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
35d50 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
35d60 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35d70 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
35d80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
35d90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
35da0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
35db0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
35dc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
35dd0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
35de0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
35df0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
35e00 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
35e10 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
35e20 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
35e30 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
35e40 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
35e50 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
35e60 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
35e70 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
35e80 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
35e90 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
35ea0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
35eb0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
35ec0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
35ed0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
35ee0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
35ef0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
35f00 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
35f10 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
35f20 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
35f30 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
35f40 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
35f50 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
35f60 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
35f70 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
35f80 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
35f90 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
35fa0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
35fb0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
35fc0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
35fd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
35fe0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
35ff0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
36000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
36010 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
36020 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
36030 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
36040 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
36050 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
36060 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
36070 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
36080 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
36090 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
360a0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
360b0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
360c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
360d0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
360e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
360f0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
36100 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
36110 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
36120 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
36130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36140 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
36150 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
36160 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
36170 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
36180 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
36190 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
361a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
361b0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
361c0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
361d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
361e0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
361f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
36200 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
36210 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
36220 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
36230 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
36240 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
36250 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
36260 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
36270 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
36280 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
36290 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
362a0 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
362b0 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
362c0 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
362d0 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
362e0 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
362f0 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
36300 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
36310 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
36320 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
36330 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
36340 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
36350 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
36360 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36370 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
36380 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
36390 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
363a0 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
363b0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
363c0 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
363d0 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
363e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
363f0 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  Leaf ){.    nHea
36400 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
36410 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
36420 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
36430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
36440 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a  rt( nData==0 );.
36450 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72      assert( nZer
36460 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48  o==0 );.  }.  nH
36470 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
36480 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
36490 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
364a0 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
364b0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73  in the payload s
364c0 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ize */.  if( pPa
364d0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
364e0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
364f0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
36500 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
36510 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61  .  }else{ .    a
36520 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37  ssert( nKey<=0x7
36530 66 66 66 66 66 66 66 20 26 26 20 70 4b 65 79 21  fffffff && pKey!
36540 3d 30 20 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  =0 );.    nPaylo
36550 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  ad = (int)nKey;.
36560 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
36570 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
36580 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  )nKey;.  }.  if(
36590 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
365a0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
365b0 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20    n = nHeader + 
365c0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65  nPayload;.    te
365d0 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a  stcase( n==3 );.
365e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
365f0 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  =4 );.    if( n<
36600 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a  4 ) n = 4;.    *
36610 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  pnSize = n;.    
36620 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79  spaceLeft = nPay
36630 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72  load;.    pPrior
36640 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73   = pCell;.  }els
36650 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20  e{.    int mn = 
36660 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
36670 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e  .    n = mn + (n
36680 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20  Payload - mn) % 
36690 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
366a0 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
366b0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
366c0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
366d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
366e0 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
366f0 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
36700 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  n > pPage->maxLo
36710 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20  cal ) n = mn;.  
36720 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b    spaceLeft = n;
36730 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
36740 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a   + nHeader + 4;.
36750 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43      pPrior = &pC
36760 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a  ell[nHeader+n];.
36770 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d    }.  pPayload =
36780 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
36790 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
367a0 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20  point variables 
367b0 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73  should be set as
367c0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
367d0 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20   **   nPayload  
367e0 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70           Total p
367f0 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62  ayload size in b
36800 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79  ytes.  **   pPay
36810 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42  load           B
36820 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79  egin writing pay
36830 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20  load here.  **  
36840 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20   spaceLeft      
36850 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61      Space availa
36860 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e  ble at pPayload.
36870 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70    If nPayload>sp
36880 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20  aceLeft,.  **   
36890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368a0 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f     that means co
368b0 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c  ntent must spill
368c0 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
368d0 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e  ages..  **   *pn
368e0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
368f0 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61  Size of the loca
36900 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e  l cell (not coun
36910 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61  ting overflow pa
36920 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69  ges).  **   pPri
36930 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57  or             W
36940 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
36950 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69  e pgno of the fi
36960 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
36970 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20  e.  **.  ** Use 
36980 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50  a call to btreeP
36990 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f  arseCellPtr() to
369a0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
369b0 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20   values above.  
369c0 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  ** were computed
369d0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
369e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
369f0 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  G.  {.    CellIn
36a00 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61  fo info;.    pPa
36a10 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
36a20 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
36a30 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
36a40 20 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69   nHeader=(int)(i
36a50 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
36a60 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73  Cell) );.    ass
36a70 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
36a80 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
36a90 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
36aa0 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
36ab0 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
36ac0 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
36ad0 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
36ae0 20 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c   pPrior == &pCel
36af0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
36b00 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ] );.  }.#endif.
36b10 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
36b20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
36b30 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
36b40 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
36b50 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
36b60 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
36b70 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
36b80 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
36b90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36ba0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36bb0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
36bc0 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
36bd0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
36be0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
36bf0 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
36c00 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
36c10 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
36c20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
36c30 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
36c40 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
36c50 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
36c60 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
36c70 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
36c80 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
36c90 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
36ca0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
36cb0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
36cc0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
36cd0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
36ce0 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
36cf0 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
36d00 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
36d10 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
36d20 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
36d30 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
36d40 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
36d50 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
36d60 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
36d70 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
36d80 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
36d90 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
36da0 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
36db0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
36dc0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
36dd0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
36de0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
36df0 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
36e00 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
36e10 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
36e20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
36e30 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
36e40 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
36e50 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
36e60 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
36e70 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
36e80 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
36e90 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
36ea0 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
36eb0 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73  itialized values
36ec0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
36ed0 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
36ee0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
36ef0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
36f00 0a 20 20 20 20 20 20 69 66 28 20 52 45 51 55 49  .      if( REQUI
36f10 52 45 5f 50 54 52 4d 41 50 20 26 26 20 72 63 3d  RE_PTRMAP && rc=
36f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36f30 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
36f40 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
36f50 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
36f60 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
36f70 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
36f80 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
36f90 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
36fa0 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
36fb0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
36fc0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
36fd0 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
36fe0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36ff0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37000 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37010 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
37020 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37030 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
37040 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
37050 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
37060 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
37070 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
37080 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
37090 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
370a0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
370b0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
370c0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
370d0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
370e0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
370f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37100 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
37110 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
37120 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
37130 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
37140 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
37150 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
37160 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
37170 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
37180 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
37190 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
371a0 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
371b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
371c0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
371d0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
371e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
371f0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
37200 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
37210 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
37220 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
37230 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
37240 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
37250 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
37260 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
37270 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
37280 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
37290 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
372a0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
372b0 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
372c0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
372d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
372e0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
372f0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
37300 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
37310 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
37320 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
37330 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
37340 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
37350 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
37360 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
37370 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
37380 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
37390 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
373a0 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
373b0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
373c0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
373d0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
373e0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
373f0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
37400 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
37410 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
37420 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
37430 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
37440 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
37450 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37460 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37470 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
37480 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
37490 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
374a0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
374b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
374c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
374d0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
374e0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
374f0 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
37500 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
37510 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
37520 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
37530 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
37540 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
37550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37560 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
37570 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
37580 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
37590 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
375a0 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
375b0 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
375c0 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
375d0 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
375e0 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
375f0 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
37600 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
37610 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
37620 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
37630 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
37640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
37650 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
37660 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
37670 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
37680 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
37690 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
376a0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
376b0 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
376c0 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
376d0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
376e0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
376f0 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
37700 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
37710 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
37720 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
37730 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
37740 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
37750 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
37760 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
37770 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
37780 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
37790 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
377a0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
377b0 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
377c0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
377d0 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
377e0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
377f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
37800 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
37810 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
37820 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
37830 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
37840 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
37850 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
37860 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
37870 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
37880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37890 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
378a0 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
378b0 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
378c0 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
378d0 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
378e0 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
378f0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
37900 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
37910 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
37920 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
37930 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
37940 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  | sz==cellSize(p
37950 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
37960 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
37970 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37980 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
37990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
379a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
379b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
379c0 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
379d0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
379e0 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65  tr = &pPage->aCe
379f0 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20  llIdx[2*idx];.  
37a00 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
37a10 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
37a20 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
37a30 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
37a40 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
37a50 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
37a60 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
37a70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37a80 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
37a90 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64  (u32)get2byte(&d
37aa0 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70  ata[hdr+5]) || p
37ab0 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
37ac0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
37ad0 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
37ae0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
37af0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
37b00 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
37b10 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
37b20 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
37b30 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
37b40 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
37b50 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
37b60 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
37b70 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  l==0 ){.    mems
37b80 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
37b90 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61   0, 4);.    data
37ba0 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20  [hdr+7] = 0;.   
37bb0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
37bc0 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70  hdr+5], pPage->p
37bd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
37be0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
37bf0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
37c00 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61  usableSize - pPa
37c10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20  ge->hdrOffset.  
37c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c30 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68       - pPage->ch
37c40 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a  ildPtrSize - 8;.
37c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
37c60 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c  move(ptr, ptr+2,
37c70 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   2*(pPage->nCell
37c80 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75   - idx));.    pu
37c90 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
37ca0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
37cb0 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  l);.    pPage->n
37cc0 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d  Free += 2;.  }.}
37cd0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
37ce0 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
37cf0 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
37d00 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
37d10 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
37d20 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
37d30 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
37d40 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
37d50 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
37d60 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
37d70 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
37d80 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
37d90 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
37da0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
37db0 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
37dc0 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
37dd0 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
37de0 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
37df0 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
37e00 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
37e10 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  pOvfl[] and make
37e20 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
37e30 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
37e40 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
37e50 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
37e60 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
37e70 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
37e80 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
37e90 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
37ea0 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
37eb0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
37ec0 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
37ed0 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
37ee0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
37ef0 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
37f00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
37f10 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
37f20 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
37f30 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
37f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
37f50 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
37f60 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
37f70 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
37f80 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
37f90 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
37fa0 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
37fb0 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
37fc0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
37fd0 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
37fe0 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
37ff0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
38000 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
38010 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
38020 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
38030 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
38040 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
38050 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
38060 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
38070 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
38080 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
38090 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
380a0 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
380b0 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30  ){.  int idx = 0
380c0 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
380d0 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
380e0 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
380f0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
38100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
38110 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
38120 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
38130 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
38140 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
38150 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73  ge */.  u8 *pIns
38160 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
38170 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d   point in pPage-
38180 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72  >aCellIdx[] wher
38190 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74  e no cell insert
381a0 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ed */..  if( *pR
381b0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
381c0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
381d0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
381e0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
381f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
38200 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
38210 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
38220 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
38230 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
38240 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
38250 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
38260 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
38270 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
38280 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
38290 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
382a0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
382b0 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
382c0 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
382d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
382e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
382f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
38300 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
38310 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
38320 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
38330 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
38340 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
38350 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
38360 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
38370 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
38380 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
38390 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
383a0 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
383b0 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
383c0 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
383d0 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
383e0 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
383f0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
38400 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
38410 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
38420 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
38430 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the