/ Hex Artifact Content
Login

Artifact 18046bf14f0e3fa294ef3f7c2dc30ca7e95f3ac11ec222ad906e40b150051bde:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
7170: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
7180: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
7190: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
71a0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
71b0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
71c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
71d0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
71e0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
71f0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
7200: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
7210: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
7220: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
7230: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
7240: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
7250: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
7260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7270: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7280: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
7290: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
72a0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
72b0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
72c0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
72d0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
72e0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
72f0: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
7300: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
7310: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
7320: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
7330: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
7340: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
7360: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
7370: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
7380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7390: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
73a0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
73b0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
73c0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
73d0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
73e0: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
73f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7400: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
7410: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
7420: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
7430: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
7440: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
7450: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
7460: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
7470: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
7480: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
7490: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
74a0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
74b0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
74c0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
74d0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
74e0: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
74f0: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
7500: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
7510: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
7520: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
7530: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
7540: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
7550: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7560: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
7570: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
7580: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
7590: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
75c0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
75d0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
75e0: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
75f0: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
7600: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7610: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
7620: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7630: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
7640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7650: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7660: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
7670: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
7680: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
7690: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
76a0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
76b0: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
76c0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
76d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
76e0: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
76f0: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
7700: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
7710: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
7720: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7730: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7740: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
7750: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
7760: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
7770: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7780: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
7790: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
77a0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
77b0: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
77c0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
77d0: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
77e0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
77f0: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7800: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7810: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7820: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7830: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7840: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
7850: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
7860: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
7870: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
7880: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
7890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
78a0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
78b0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
78c0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
78d0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
78e0: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
78f0: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7900: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7910: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7920: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7930: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7940: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
7950: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
7960: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
7970: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
7980: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
7990: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
79a0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
79b0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
79c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
79d0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
79e0: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
79f0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7a00: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7a10: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7a20: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7a30: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7a40: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
7a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7a60: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7a70: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
7a80: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
7a90: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
7aa0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7ab0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7ac0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7ad0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7ae0: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7af0: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7b00: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7b10: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7b20: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7b30: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7b40: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7b50: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
7b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7b70: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
7b80: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7b90: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
7ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7bb0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7bc0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7bd0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7be0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7bf0: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
7c00: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7c20: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7c30: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7c40: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7c50: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c60: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c70: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c80: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c90: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7ca0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7cb0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7cc0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7cd0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7ce0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7cf0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7d00: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7d10: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7d20: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7d30: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7d40: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7d50: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d60: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d70: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d80: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d90: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7da0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7db0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7dc0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7dd0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7e00: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7e10: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7e20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7e30: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7e40: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7e50: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e60: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e70: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e90: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7ea0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7eb0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7ec0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ed0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7ee0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7ef0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7f00: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7f10: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7f20: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7f30: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7f40: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7f50: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f60: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f70: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f80: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f90: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7fa0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7fb0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7fc0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7fd0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7fe0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7ff0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8000: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8010: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8020: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8030: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8060: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8070: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8080: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8090: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
80a0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
80b0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
80c0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
80d0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
80e0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
80f0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8100: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8110: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8120: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8140: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8150: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8160: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8180: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
81a0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
81b0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
81c0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
81d0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
81e0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81f0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8200: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8210: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8220: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8230: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8240: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8250: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8260: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8270: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8280: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8290: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
82a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
82b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82c0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
82d0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
82e0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
82f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8300: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8310: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8320: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8330: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8340: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8350: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8360: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8370: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8380: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8390: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
83a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
83b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
83d0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
83e0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
83f0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8400: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
84a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
84b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
84c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
84d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
84e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
84f0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
8500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
8510: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
8520: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8530: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8540: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8550: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8560: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8570: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8590: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
85a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
85b0: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
85c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
85d0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
85e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
85f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
8600: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
8610: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
8620: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8630: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8640: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8650: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8660: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8670: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8680: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8690: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
86a0: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
86b0: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
86c0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
86d0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
86e0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
86f0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
8700: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
8710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8720: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8730: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8740: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8750: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8760: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8770: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8780: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8790: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
87a0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
87b0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
87c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
87d0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
87e0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
87f0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8800: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8810: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8820: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8830: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8840: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8860: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8870: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8880: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8890: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
88a0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
88b0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
88c0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
88d0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
88e0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
88f0: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8900: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8920: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8950: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8960: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8970: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8980: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8990: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
89a0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
89b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
89c0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
89d0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
89e0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
89f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8a00: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8a10: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8a20: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8a30: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8a40: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8a50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a80: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a90: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8aa0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8ab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8ac0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8ad0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8af0: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8b00: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8b30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8b40: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8b50: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b70: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b80: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b90: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8bc0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8bd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8be0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8bf0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8c00: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8c10: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8c20: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8c30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8c40: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c80: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c90: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8ca0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8cb0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8cc0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8cd0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8ce0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8cf0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8d00: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8d10: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8d20: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8d30: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8d40: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8d50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d60: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d80: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d90: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8da0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8dc0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8dd0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8de0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8df0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8e00: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8e10: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8e30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8e40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8e50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8ea0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8eb0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8ec0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ed0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8ee0: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8ef0: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8f00: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8f10: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8f20: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8f30: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8f40: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8f50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f60: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f70: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f80: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f90: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8fa0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8fb0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8fc0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8fd0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8fe0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8ff0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9000: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
9010: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
9020: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9030: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9040: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9050: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9060: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9070: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9080: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9090: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
90a0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
90b0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
90c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
90d0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
90e0: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
90f0: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
9100: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
9110: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
9120: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9130: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9140: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9150: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9160: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9170: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9180: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9190: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
91a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
91b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
91c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9200: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9210: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9230: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9240: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9250: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9260: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9270: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9280: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9290: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
92a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
92b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
92c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
92d0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
92e0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
92f0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
9300: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
9310: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
9320: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9330: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9340: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9350: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9360: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9370: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9380: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9390: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
93a0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
93b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
93c0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
93d0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
93e0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
93f0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9400: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
9410: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
9420: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9430: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9440: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9450: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9460: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9470: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9480: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9490: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
94a0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
94b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
94c0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
94d0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
94e0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
94f0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
9500: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
9510: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
9520: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9530: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9550: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9560: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9570: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9580: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9590: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
95a0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
95b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
95c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
95d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
95f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9600: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
9610: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
9620: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9630: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9640: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9650: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9660: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9670: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9680: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9690: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
96a0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
96b0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
96c0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
96d0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
96e0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
96f0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
9700: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
9710: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
9720: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9730: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9740: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9750: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9760: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9770: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9780: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9790: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
97a0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
97b0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
97c0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
97d0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
97e0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
97f0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
9800: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
9810: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
9820: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9830: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9850: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9860: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9880: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9890: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98d0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98e0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9900: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9910: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
9920: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9930: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9940: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9950: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9970: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9980: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
99a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
99b0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
99c0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
99d0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
99e0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
99f0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9a00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9a10: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9a30: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9a40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9a50: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a60: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a70: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9aa0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9ab0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9ac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9ad0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9ae0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9af0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9b00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9b10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9b20: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9b30: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9b40: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9b50: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b60: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b80: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b90: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9ba0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9bb0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9bc0: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9be0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9bf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9c20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9c30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9c40: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9c50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c60: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c70: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c80: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c90: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9ca0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9cc0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9cd0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9ce0: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9cf0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9d00: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9d10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9d20: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9d30: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9d40: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9d50: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d60: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d70: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d80: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d90: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9da0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9db0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9dc0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9dd0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9de0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9df0: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9e00: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9e10: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9e20: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9e30: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9e40: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9e50: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e60: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e70: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e80: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e90: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9ea0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9eb0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9ec0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ed0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9ee0: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9ef0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9f00: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9f10: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9f20: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9f30: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9f40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9f50: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f70: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f80: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9fb0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9fc0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9fd0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9fe0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9ff0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a000: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a010: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a020: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a030: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a040: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a050: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a060: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a080: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a090: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a0a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a0b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a0c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a0d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a0e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a0f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a100: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a110: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a120: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a130: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a140: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a150: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a160: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a170: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a180: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a1a0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a1b0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a1c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a1d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a1e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a1f0: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a200: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a210: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a220: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a230: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a250: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a260: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a270: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a280: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a290: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a2a0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2c0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a2d0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a2e0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a300: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a310: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a340: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a360: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a370: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a390: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a3a0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a3b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a3c0: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a3d0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a3e0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a3f0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a400: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a410: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a420: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a430: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a440: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a450: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a460: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a470: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a480: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a490: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a4a0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a4b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a4c0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a4d0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a4e0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a500: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a520: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a530: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a540: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a550: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a560: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a570: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a580: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a590: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a5a0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a5b0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a5c0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a5d0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a5e0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a5f0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a600: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a610: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a620: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a630: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a640: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a650: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a660: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a670: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a680: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a690: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a6a0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a6b0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a6c0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a6d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a6e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a6f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a700: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a710: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a720: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a730: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a740: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a750: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a760: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a780: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a790: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a7a0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a7b0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a7d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a7e0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a7f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a800: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a810: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a820: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a830: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a840: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a850: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a860: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a870: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a880: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a8a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a8b0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a8c0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a8d0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a8e0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a8f0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a900: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a910: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a920: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a930: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a940: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a950: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a960: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a970: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a980: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a990: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a9a0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a9b0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a9c0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a9d0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a9e0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a9f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
aa00: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
aa10: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa40: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
aa50: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa60: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa90: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aaa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aab0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aae0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aaf0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
ab00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
ab10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
ab20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ab30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ab40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ab50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
aba0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
abb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
abc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
abd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
ac00: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
ac10: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
ac20: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ac30: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ac40: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ac50: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac60: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac70: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac80: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac90: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
aca0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
acb0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
acc0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
acd0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ace0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
acf0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
ad00: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ad10: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
ad20: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ad30: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ad40: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ad50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad60: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad70: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad80: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ada0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
adb0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
adc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
add0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ade0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
adf0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
ae00: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
ae10: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
ae20: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ae30: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ae40: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae60: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae70: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae80: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae90: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
aea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
aeb0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
aec0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aed0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
aee0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
aef0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
af00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
af10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
af20: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
af30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
af40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af60: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af70: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af80: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af90: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
afb0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
afc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
afd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
afe0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
aff0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
b000: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b010: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
b020: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b030: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b040: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b050: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b060: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b070: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b080: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b090: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b0b0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b0c0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b0e0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b0f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b100: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b110: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b120: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b130: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b140: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b150: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b160: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b170: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b180: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b190: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b1a0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b1b0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b1c0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b1d0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b1e0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b1f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b200: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b210: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b220: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b230: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b240: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b250: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b270: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b280: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b290: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b2a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b2b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b2c0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b2d0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b2e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b2f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b300: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b310: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b320: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b330: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b340: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b350: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b360: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b370: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b380: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b390: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b3b0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b3c0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b3d0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b3e0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b3f0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b410: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b430: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b440: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b450: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b460: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b470: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b480: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b490: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b4a0: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b4b0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b4c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b4d0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b4e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b4f0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b500: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b510: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b520: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b530: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b540: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b560: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b570: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b580: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b590: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b5a0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b5b0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b5c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b5d0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b5e0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b5f0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b600: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b610: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b620: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b630: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b640: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b650: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b660: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b670: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b690: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b6a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b6d0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b6e0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b6f0: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b700: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b710: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b720: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b730: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b740: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b750: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b760: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b770: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b780: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b790: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b7a0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b7b0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b7c0: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b7d0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b7e0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b7f0: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b800: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b810: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b820: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b830: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b840: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b850: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b860: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b870: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b880: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b890: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b8a0: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b8b0: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b8c0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b8d0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b8e0: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b8f0: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b900: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b910: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b920: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b930: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b940: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b950: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b960: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b970: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b980: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b990: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b9a0: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b9d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b9e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b9f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ba00: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
ba10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
ba40: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
ba50: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba70: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba80: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
baa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bab0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bac0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bad0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bae0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
baf0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bb00: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bb10: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bb30: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bb40: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bb50: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb70: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb80: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bba0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bbb0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bbc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bbd0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bbe0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bbf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bc00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bc10: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bc20: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bc30: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bc40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bc50: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc70: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc90: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bca0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bcb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bcc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bcd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bcf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bd00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bd10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bd20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bd30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bd50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd90: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bda0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bdb0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bdc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bdd0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bde0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdf0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
be00: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
be10: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
be20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
be30: 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ) );.  iCellFirs
be40: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
be50: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62   2*nCell;.  usab
be60: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
be70: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be80: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
be90: 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20  k handles pages 
bea0: 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65  with two or fewe
beb0: 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e  r free blocks an
bec0: 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20  d nMaxFrag.  ** 
bed0: 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e  or fewer fragmen
bee0: 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68  ted bytes. In th
bef0: 69 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61  is case it is fa
bf00: 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65  ster to move the
bf10: 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e  .  ** two (or on
bf20: 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c  e) blocks of cel
bf30: 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65  ls using memmove
bf40: 28 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  () and add the r
bf50: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66  equired.  ** off
bf60: 73 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69  sets to each poi
bf70: 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c  nter in the cell
bf80: 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74  -pointer array t
bf90: 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20  han it is to .  
bfa0: 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74  ** reconstruct t
bfb0: 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20  he entire page. 
bfc0: 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64   */.  if( (int)d
bfd0: 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78  ata[hdr+7]<=nMax
bfe0: 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Frag ){.    int 
bff0: 69 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65  iFree = get2byte
c000: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c010: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
c020: 6e 69 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b  nitial freeblock
c030: 20 6f 66 66 73 65 74 20 77 65 72 65 20 6f 75 74   offset were out
c040: 20 6f 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74   of bounds, that
c050: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 68 61   would.    ** ha
c060: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
c070: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
c080: 65 28 29 20 77 68 65 6e 20 69 74 20 77 61 73 20  e() when it was 
c090: 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 0a 20 20  computing the.  
c0a0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66    ** number of f
c0b0: 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ree bytes on the
c0c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
c0d0: 73 65 72 74 28 20 69 46 72 65 65 3c 3d 75 73 61  sert( iFree<=usa
c0e0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
c0f0: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
c100: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
c110: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c120: 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20 20 69  iFree]);.      i
c130: 66 28 20 69 46 72 65 65 32 3e 75 73 61 62 6c 65  f( iFree2>usable
c140: 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72 6e 20  Size-4 ) return 
c150: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c160: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c170: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
c180: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
c190: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
c1a0: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
c1b0: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
c1c0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c1d0: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
c1e0: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
c1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
c200: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
c210: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
c220: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
c230: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
c240: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c250: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
c260: 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65    if( top>=iFree
c270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
c280: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c290: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
c2a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c2b0: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
c2c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c2d0: 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29  Free+sz>iFree2 )
c2e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c2f0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c300: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  e);.          sz
c310: 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  2 = get2byte(&da
c320: 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20  ta[iFree2+2]);. 
c330: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
c340: 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62 6c 65  ee2+sz2 > usable
c350: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
c360: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c370: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c380: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
c390: 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c  a[iFree+sz+sz2],
c3a0: 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d   &data[iFree+sz]
c3b0: 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  , iFree2-(iFree+
c3c0: 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sz));.          
c3d0: 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20  sz += sz2;.     
c3e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72     }.        cbr
c3f0: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c400: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c410: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c420: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c430: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c440: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c450: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c460: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c470: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c480: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c490: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c4a0: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c4b0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c4c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c4d0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c4e0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c4f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c500: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c510: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c520: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c540: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c550: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c560: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c570: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c580: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c590: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c5a0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c5b0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c5c0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c5d0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c5e0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c5f0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c600: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c610: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c620: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c630: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c640: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c650: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c660: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c670: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c680: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c690: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c6a0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c6b0: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c6c0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c6d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c6e0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c6f0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c700: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c710: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c720: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c730: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c740: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c750: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c760: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c770: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c780: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c790: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c7a0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c7b0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c7c0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c7d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7e0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c7f0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c800: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c810: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c820: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c830: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c840: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c850: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c860: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c870: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c880: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c890: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c8a0: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c8b0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c8c0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c8d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8e0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c8f0: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c900: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c910: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c920: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c930: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c940: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c950: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c960: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c970: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c980: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c990: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c9a0: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c9b0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c9c0: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c9d0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
c9e0: 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  7]+cbrk-iCellFir
c9f0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
ca00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ca10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ca20: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
ca30: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
ca40: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
ca50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
ca60: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
ca70: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
ca80: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
ca90: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
caa0: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
cab0: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
cac0: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
cad0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
cae0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
caf0: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
cb00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cb10: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
cb20: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
cb30: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
cb40: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
cb50: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
cb60: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
cb70: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
cb80: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
cb90: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
cba0: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
cbb0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
cbc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
cbd0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
cbe0: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
cbf0: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
cc00: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
cc10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
cc20: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
cc30: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
cc40: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
cc50: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
cc60: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
cc70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
cc80: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
cc90: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
cca0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
ccb0: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
ccc0: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
ccd0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
cce0: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
ccf0: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
cd00: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
cd10: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
cd20: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
cd30: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
cd40: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
cd50: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
cd60: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
cd70: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
cd80: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
cd90: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
cda0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
cdb0: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
cdc0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
cdd0: 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
cde0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
cdf0: 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
ce00: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
ce10: 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a 2f 0a  /* Page data */.
ce20: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
ce30: 72 20 2b 20 31 3b 20 20 20 20 20 20 20 20 20 20  r + 1;          
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce50: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
ce60: 6f 20 70 63 20 2a 2f 0a 20 20 69 6e 74 20 70 63  o pc */.  int pc
ce70: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
ce80: 74 61 5b 69 41 64 64 72 5d 29 3b 20 20 20 20 20  ta[iAddr]);     
ce90: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
cea0: 6f 66 20 61 20 66 72 65 65 20 73 6c 6f 74 20 2a  of a free slot *
ceb0: 2f 0a 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20  /.  int x;      
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cee0: 2a 20 45 78 63 65 73 73 20 73 69 7a 65 20 6f 66  * Excess size of
cef0: 20 74 68 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69   the slot */.  i
cf00: 6e 74 20 6d 61 78 50 43 20 3d 20 70 50 67 2d 3e  nt maxPC = pPg->
cf10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
cf20: 2d 20 6e 42 79 74 65 3b 20 20 2f 2a 20 4d 61 78  - nByte;  /* Max
cf30: 20 61 64 64 72 65 73 73 20 66 6f 72 20 61 20 75   address for a u
cf40: 73 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 20 20  sable slot */.  
cf50: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cf80: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73  ze of the free s
cf90: 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lot */..  assert
cfa0: 28 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c  ( pc>0 );.  whil
cfb0: 65 28 20 70 63 3c 3d 6d 61 78 50 43 20 29 7b 0a  e( pc<=maxPC ){.
cfc0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cfd0: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
cfe0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
cff0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
d000: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
d010: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
d020: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
d030: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
d040: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
d050: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
d060: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
d070: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
d080: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
d090: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
d0a0: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
d0b0: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
d0c0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
d0d0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
d0e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d0f0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
d100: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
d110: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d120: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
d130: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
d140: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
d150: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
d160: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
d170: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
d180: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
d190: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
d1a0: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
d1b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d1c0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
d1d0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
d1e0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
d1f0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
d200: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
d210: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
d220: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
d230: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
d240: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
d250: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
d260: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
d270: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
d280: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
d290: 2b 70 63 20 3e 20 6d 61 78 50 43 20 29 7b 0a 20  +pc > maxPC ){. 
d2a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73         /* This s
d2b0: 6c 6f 74 20 65 78 74 65 6e 64 73 20 6f 66 66 20  lot extends off 
d2c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 75  the end of the u
d2d0: 73 61 62 6c 65 20 70 61 72 74 20 6f 66 20 74 68  sable part of th
d2e0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
d2f0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
d300: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
d310: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
d320: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
d330: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
d340: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
d350: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
d360: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
d370: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
d380: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
d390: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
d3a0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
d3b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
d3c0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
d3d0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
d3e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
d3f0: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
d400: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
d410: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
d420: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
d430: 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64  ;.    if( pc<iAd
d440: 64 72 2b 73 69 7a 65 20 29 7b 0a 20 20 20 20 20  dr+size ){.     
d450: 20 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20 20   if( pc ){.     
d460: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73     /* The next s
d470: 6c 6f 74 20 69 6e 20 74 68 65 20 63 68 61 69 6e  lot in the chain
d480: 20 69 73 20 6e 6f 74 20 70 61 73 74 20 74 68 65   is not past the
d490: 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72   end of the curr
d4a0: 65 6e 74 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ent slot */.    
d4b0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
d4c0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
d4d0: 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
d4e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
d4f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 3e   }.  }.  if( pc>
d500: 6d 61 78 50 43 2b 6e 42 79 74 65 2d 34 20 29 7b  maxPC+nByte-4 ){
d510: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65  .    /* The free
d520: 20 73 6c 6f 74 20 63 68 61 69 6e 20 65 78 74 65   slot chain exte
d530: 6e 64 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20  nds off the end 
d540: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
d550: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
d560: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
d570: 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
d580: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   0;.}../*.** All
d590: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
d5a0: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
d5b0: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
d5c0: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
d5d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
d5e0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
d5f0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
d600: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
d610: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
d620: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
d630: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
d640: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
d650: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
d660: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
d670: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
d680: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
d690: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
d6a0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
d6b0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
d6c0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
d6d0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
d6e0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
d6f0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
d700: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
d710: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
d720: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
d730: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
d740: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
d750: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
d760: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
d770: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
d780: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
d790: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
d7a0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
d7b0: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
d7c0: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
d7d0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
d7e0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
d7f0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
d800: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
d810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
d820: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
d830: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
d840: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
d850: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
d860: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
d870: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
d880: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
d890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
d8a0: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
d8b0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
d8c0: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
d8d0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
d8e0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
d8f0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
d920: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
d930: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rea */.  int rc 
d940: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d960: 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   Integer return 
d970: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61  code */.  int ga
d980: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
d990: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
d9a0: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
d9b0: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
d9c0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73  ntent */.  .  as
d9d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d9e0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d9f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
da00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
da10: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
da20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
da40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
da50: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
da60: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
da70: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
da80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
da90: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
daa0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
dab0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
dac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
dad0: 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d  e < (int)(pPage-
dae0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
daf0: 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  -8) );..  assert
db00: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
db10: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
db20: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
db30: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
db40: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
db50: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
db60: 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35   assert( gap<=65
db70: 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  536 );.  /* EVID
db80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36  ENCE-OF: R-29356
db90: 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61  -02391 If the da
dba0: 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35  tabase uses a 65
dbb0: 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69  536-byte page si
dbc0: 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ze.  ** and the 
dbd0: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69  reserved space i
dbe0: 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61  s zero (the usua
dbf0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65  l value for rese
dc00: 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a  rved space).  **
dc10: 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63   then the cell c
dc20: 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66  ontent offset of
dc30: 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
dc40: 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36  ants to be 65536
dc50: 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
dc60: 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20  that integer is 
dc70: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
dc80: 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79  stored in a 2-by
dc90: 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a  te unsigned.  **
dca0: 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76   integer, so a v
dcb0: 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65  alue of 0 is use
dcc0: 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  d in its place. 
dcd0: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
dce0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
dcf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
dd00: 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  <=(int)pPage->pB
dd10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
dd20: 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67   /* Prevent by g
dd30: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20  etAndInitPage() 
dd40: 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  */.  if( gap>top
dd50: 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d   ){.    if( top=
dd60: 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74  =0 && pPage->pBt
dd70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35  ->usableSize==65
dd80: 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  536 ){.      top
dd90: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
dda0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
ddb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ddc0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ddd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
dde0: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
ddf0: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
de00: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
de10: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
de20: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
de30: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
de40: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
de50: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
de60: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
de70: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
de80: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
de90: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
dea0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
deb0: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
dec0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
ded0: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
dee0: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
def0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
df00: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
df10: 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20  (data[hdr+2] || 
df20: 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20  data[hdr+1]) && 
df30: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
df40: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
df50: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
df60: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  e, nByte, &rc);.
df70: 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29      if( pSpace )
df80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
df90: 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20  pSpace>=data && 
dfa0: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c  (pSpace - data)<
dfb0: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a  65536 );.      *
dfc0: 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70  pIdx = (int)(pSp
dfd0: 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20  ace - data);.   
dfe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dff0: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
e000: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
e010: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e020: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
e030: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
e040: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
e050: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
e060: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
e070: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
e080: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
e090: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
e0a0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
e0b0: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
e0c0: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
e0d0: 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  op ){.    assert
e0e0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
e0f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
e100: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
e110: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c  gmentPage(pPage,
e120: 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e   MIN(4, pPage->n
e130: 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29  Free - (2+nByte)
e140: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
e150: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e160: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
e170: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
e180: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
e190: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f   gap+2+nByte<=to
e1a0: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
e1b0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
e1c0: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
e1d0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
e1e0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
e1f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
e200: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
e210: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
e220: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
e230: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
e240: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
e250: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
e260: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
e270: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
e280: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
e290: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
e2a0: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
e2b0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
e2c0: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
e2d0: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
e2e0: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
e2f0: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
e300: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
e310: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
e320: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
e330: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
e340: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
e350: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
e360: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
e370: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
e380: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e390: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
e3a0: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
e3b0: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
e3c0: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
e3d0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
e3e0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
e3f0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
e400: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
e410: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
e420: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
e430: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
e440: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
e450: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
e460: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
e470: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
e480: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
e490: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
e4a0: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
e4b0: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
e4c0: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
e4d0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
e4e0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
e4f0: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
e500: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
e510: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
e520: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
e530: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
e540: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
e550: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
e560: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
e570: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
e580: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
e590: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
e5a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e5b0: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
e5c0: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
e5d0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
e5e0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
e5f0: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
e600: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
e610: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e640: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
e650: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
e660: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
e690: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
e6a0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6d0: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
e6e0: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
e6f0: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
e720: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
e730: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
e740: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
e750: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e760: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
e770: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
e780: 20 20 75 31 36 20 78 3b 20 20 20 20 20 20 20 20    u16 x;        
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
e7b0: 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
e7c0: 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33 32 20  t area */.  u32 
e7d0: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
e7e0: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
e7f0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
e800: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
e810: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
e820: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
e830: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
e840: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
e850: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
e860: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
e870: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e880: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
e890: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
e8a0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
e8b0: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
e8c0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
e8d0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
e8e0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
e8f0: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
e900: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
e910: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
e920: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
e930: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e940: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e950: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
e960: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
e970: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
e980: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
e990: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
e9a0: 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt<=pPage->pBt->
e9b0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
e9c0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
e9d0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
e9e0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
e9f0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
ea00: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
ea10: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
ea20: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
ea30: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
ea40: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
ea50: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
ea60: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
ea70: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
ea80: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
ea90: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
eaa0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
eab0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
eac0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
ead0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
eae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
eaf0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
eb00: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
eb10: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
eb20: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
eb30: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
eb40: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
eb50: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
eb60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
eb70: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
eb80: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
eb90: 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  }.      iPtr = i
eba0: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
ebb0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
ebc0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ebd0: 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20  leSize-4 ){.    
ebe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ebf0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
ec00: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
ec10: 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e  ssert( iFreeBlk>
ec20: 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b  iPtr || iFreeBlk
ec30: 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ==0 );.  .    /*
ec40: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a   At this point:.
ec50: 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42      **    iFreeB
ec60: 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65  lk:   First free
ec70: 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61  block after iSta
ec80: 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e  rt, or zero if n
ec90: 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50  one.    **    iP
eca0: 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64  tr:       The ad
ecb0: 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74  dress of a point
ecc0: 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20  er to iFreeBlk. 
ecd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65     **.    ** Che
ece0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72  ck to see if iFr
ecf0: 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20  eeBlk should be 
ed00: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
ed10: 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74  he end of iStart
ed20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ed30: 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e   iFreeBlk && iEn
ed40: 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b  d+3>=iFreeBlk ){
ed50: 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69  .      nFrag = i
ed60: 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a  FreeBlk - iEnd;.
ed70: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69        if( iEnd>i
ed80: 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e  FreeBlk ) return
ed90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eda0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
edb0: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
edc0: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
edd0: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
ede0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
edf0: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
ee00: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
ee10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ee20: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ee30: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
ee40: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
ee50: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
ee60: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
ee70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
ee80: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
ee90: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
eea0: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
eeb0: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
eec0: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
eed0: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
eee0: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
eef0: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
ef00: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
ef10: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
ef20: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
ef30: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
ef40: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
ef50: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
ef60: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
ef70: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
ef80: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
ef90: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
efa0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
efb0: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
efc0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
efd0: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
efe0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
eff0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
f000: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
f010: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
f020: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
f030: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
f040: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
f050: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
f060: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
f070: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
f080: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f090: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
f0a0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
f0b0: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
f0c0: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
f0d0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
f0e0: 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a 20  ( iStart<=x ){. 
f0f0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
f100: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
f110: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
f120: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
f130: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
f140: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
f150: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f160: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
f170: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
f180: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
f190: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 53  ry */.    if( iS
f1a0: 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72 21 3d  tart<x || iPtr!=
f1b0: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
f1c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f1d0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70  GE(pPage);.    p
f1e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
f1f0: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
f200: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
f210: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
f220: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f230: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
f240: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
f250: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
f260: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
f270: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
f280: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  t);.  }.  if( pP
f290: 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  age->pBt->btsFla
f2a0: 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
f2b0: 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  CURE ){.    /* O
f2c0: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
f2d0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
f2e0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
f2f0: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
f300: 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20     ** option is 
f310: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  enabled */.    m
f320: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61  emset(&data[iSta
f330: 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a  rt], 0, iSize);.
f340: 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
f350: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
f360: 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32 62  reeBlk);.  put2b
f370: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
f380: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 70  +2], iSize);.  p
f390: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69  Page->nFree += i
f3a0: 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75  OrigSize;.  retu
f3b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f3c0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
f3d0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
f3e0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
f3f0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
f400: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
f410: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
f420: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
f430: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
f440: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
f450: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
f460: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
f470: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
f480: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
f490: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
f4a0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
f4b0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
f4c0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
f4d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
f4e0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
f4f0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
f500: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f510: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
f520: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
f530: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
f540: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
f550: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
f560: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
f570: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
f580: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f590: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
f5a0: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
f5b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
f5c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
f5d0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
f5e0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
f5f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f600: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
f610: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
f620: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
f630: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
f640: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
f650: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
f660: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
f670: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
f680: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
f690: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
f6a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  ;.  pPage->xCell
f6b0: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
f6c0: 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  tr;.  pBt = pPag
f6d0: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
f6e0: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
f6f0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
f700: 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  EY) ){.    /* EV
f710: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32  IDENCE-OF: R-072
f720: 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65  91-35328 A value
f730: 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65 61   of 5 (0x05) mea
f740: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
f750: 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
f760: 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  r table b-tree p
f770: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
f780: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
f790: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35  A|PTF_INTKEY)==5
f7a0: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
f7b0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d  NCE-OF: R-26900-
f7c0: 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66  09176 A value of
f7d0: 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73   13 (0x0d) means
f7e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
f7f0: 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65     ** leaf table
f800: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
f810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
f820: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
f830: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d  NTKEY|PTF_LEAF)=
f840: 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =13 );.    pPage
f850: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
f860: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
f870: 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  f ){.      pPage
f880: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31  ->intKeyLeaf = 1
f890: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f8a0: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
f8b0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20  eParseCellPtr;. 
f8c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
f8e0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
f8f0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
f900: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
f910: 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67  load;.      pPag
f920: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
f930: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
f940: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
f950: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  }.    pPage->max
f960: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
f970: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
f980: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
f990: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
f9a0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
f9b0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
f9c0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f9d0: 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30  OF: R-43316-3730
f9e0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28  8 A value of 2 (
f9f0: 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20  0x02) means the 
fa00: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
fa10: 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78  * interior index
fa20: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
fa30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
fa40: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
fa50: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
fa60: 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32  E-OF: R-59615-42
fa70: 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31  828 A value of 1
fa80: 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74  0 (0x0a) means t
fa90: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
faa0: 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62   ** leaf index b
fab0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
fac0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
fad0: 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41  ZERODATA|PTF_LEA
fae0: 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50  F)==10 );.    pP
faf0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
fb00: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
fb10: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
fb20: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
fb30: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
fb40: 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20  llPtrIndex;.    
fb50: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
fb60: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
fb70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
fb80: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
fb90: 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
fba0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
fbb0: 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39  F: R-47608-56469
fbc0: 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65   Any other value
fbd0: 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20   for the b-tree 
fbe0: 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20 20  page type is.   
fbf0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f   ** an error. */
fc00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fc10: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
fc20: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50  pPage);.  }.  pP
fc30: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
fc40: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
fc50: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
fc60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fc70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
fc80: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
fc90: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
fca0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
fcb0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
fcc0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
fcd0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
fce0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
fcf0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
fd00: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
fd10: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
fd20: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
fd30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
fd40: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
fd50: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
fd60: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
fd70: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
fd80: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
fd90: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
fda0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
fdb0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
fdc0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
fdd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
fde0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
fdf0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
fe00: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
fe10: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
fe20: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
fe30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
fe40: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
fe50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
fe60: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
fe70: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
fe80: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
fe90: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
fea0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
feb0: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
fec0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
fed0: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
fee0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75  cture */.  int u
fef0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ff00: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ff10: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
ff20: 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 63 65  page */.  u16 ce
ff30: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
ff40: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
ff50: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
ff60: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
ff70: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
ff80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ff90: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
ffa0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
ffb0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
ffc0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
ffd0: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
ffe0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
fff0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
10000 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
10010 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
10020 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
10030 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
10040 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
10050 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
10060 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
10070 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
10080 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
10090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
100a0 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b  e->pBt->db!=0 );
100b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
100c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
100d0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
100e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
100f0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
10100 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
10110 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
10120 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
10130 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
10140 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
10150 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
10160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
10170 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
10180 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
10190 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
101a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
101b0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a  ->isInit==0 );..
101c0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
101d0 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  Bt;.  hdr = pPag
101e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
101f0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
10200 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ata;.  /* EVIDEN
10210 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30  CE-OF: R-28594-0
10220 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74  2890 The one-byt
10230 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74  e flag at offset
10240 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20   0 indicating.  
10250 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
10260 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66  ge type. */.  if
10270 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
10280 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
10290 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
102a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
102b0 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
102c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
102d0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
102e0 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
102f0 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
10300 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
10310 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
10320 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  1);.  pPage->nOv
10330 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73  erflow = 0;.  us
10340 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
10350 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50  usableSize;.  pP
10360 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
10370 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
10380 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
10390 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
103a0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
103b0 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
103c0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
103d0 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
103e0 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50  ellOffset];.  pP
103f0 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
10400 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
10410 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f  ildPtrSize];.  /
10420 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10430 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
10440 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
10450 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
10460 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68  signates.  ** th
10470 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
10480 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
10490 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66  . A zero value f
104a0 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20  or this integer 
104b0 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65  is.  ** interpre
104c0 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f  ted as 65536. */
104d0 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
104e0 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
104f0 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49  dr+5]);.  /* EVI
10500 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
10510 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
10520 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
10530 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
10540 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  he.  ** number o
10550 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
10560 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d  age. */.  pPage-
10570 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
10580 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
10590 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
105a0 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
105b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
105c0 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
105d0 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
105e0 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
105f0 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
10600 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10610 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10620 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
10630 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
10640 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20  _CELL(pBt) );.  
10650 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10660 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66  R-24089-57979 If
10670 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73   a page contains
10680 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68   no cells (which
10690 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f   is only.  ** po
106a0 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
106b0 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
106c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
106d0 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
106e0 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f  e.  ** offset to
106f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10700 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
10710 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
10720 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62  minus the.  ** b
10730 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64  ytes of reserved
10740 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73   space. */.  ass
10750 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
10760 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62  l>0 || top==usab
10770 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  leSize || CORRUP
10780 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  T_DB );..  /* A 
10790 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
107a0 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
107b0 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
107c0 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a  ast the end.  **
107d0 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
107e0 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
107f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
10800 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
10810 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
10820 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
10830 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a 2a  ell extends.  **
10840 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10850 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
10860 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
10870 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
10880 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20   .  ** returned 
10890 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f  if it does..  */
108a0 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
108b0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
108c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  Page->nCell;.  i
108d0 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
108e0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28  eSize - 4;.  if(
108f0 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20   pBt->db->flags 
10900 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a  & SQLITE_CellSiz
10910 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eCk ){.    int i
10920 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10930 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
10940 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
10950 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 3b  y */.    int sz;
10960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10970 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
10980 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
10990 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
109a0 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t--;.    for(i=0
109b0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
109c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 63  ; i++){.      pc
109d0 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   = get2byteAlign
109e0 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  ed(&data[cellOff
109f0 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
10a00 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
10a10 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
10a20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
10a30 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
10a40 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
10a50 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
10a60 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
10a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10a80 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10a90 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10aa0 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
10ab0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
10ac0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
10ad0 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
10ae0 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
10af0 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
10b00 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10b20 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10b30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
10b40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
10b50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
10b60 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20 20  ellLast++;.  }  
10b70 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
10b80 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
10b90 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
10ba0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
10bb0 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20  : R-23588-34450 
10bc0 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
10bd0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31  eger at offset 1
10be0 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20   gives the.  ** 
10bf0 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
10c00 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
10c10 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
10c20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
10c30 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c  e no.  ** freebl
10c40 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20  ocks. */.  pc = 
10c50 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
10c60 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20  dr+1]);.  nFree 
10c70 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
10c80 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
10c90 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
10ca0 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
10cb0 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b  */.  if( pc>0 ){
10cc0 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73  .    u32 next, s
10cd0 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  ize;.    if( pc<
10ce0 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
10cf0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
10d00 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
10d10 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
10d20 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
10d30 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
10d40 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
10d50 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
10d60 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10d70 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
10d80 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10d90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10da0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a 20  _PAGE(pPage); . 
10db0 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
10dc0 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
10dd0 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
10de0 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c         /* Freebl
10df0 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ock off the end 
10e00 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
10e10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10e20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10e30 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10e40 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
10e50 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10e60 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
10e70 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10e80 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46  pc+2]);.      nF
10e90 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
10ea0 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ze;.      if( ne
10eb0 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20  xt<=pc+size+3 ) 
10ec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20  break;.      pc 
10ed0 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  = next;.    }.  
10ee0 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a    if( next>0 ){.
10ef0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f        /* Freeblo
10f00 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64  ck not in ascend
10f10 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
10f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10f30 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10f40 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
10f50 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73  if( pc+size>(uns
10f60 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65  igned int)usable
10f70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
10f80 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20   Last freeblock 
10f90 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61 67  extends past pag
10fa0 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72  e end */.      r
10fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10fc0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10fe0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
10ff0 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
11000 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
11010 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
11020 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  rt.  ** of the c
11030 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
11040 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
11050 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
11060 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63  ithin.  ** the c
11070 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
11080 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
11090 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
110a0 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f  able-size.  ** o
110b0 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
110c0 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
110d0 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
110e0 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a  s check also.  *
110f0 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
11100 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
11110 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
11120 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
11130 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61  ent.  ** area, a
11140 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
11150 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
11160 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
11170 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  e..  */.  if( nF
11180 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
11190 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
111a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
111b0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  (pPage);.  }.  p
111c0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
111d0 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
111e0 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65  lFirst);.  pPage
111f0 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
11200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
11220 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
11230 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
11240 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
11250 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
11260 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
11270 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
11280 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
11290 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
112a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
112b0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
112c0 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
112d0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
112e0 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
112f0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
11300 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
11310 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11320 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
11330 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
11340 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
11350 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11360 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
11370 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
11380 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
11390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
113a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
113b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
113c0 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
113d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
113e0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
113f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
11400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11410 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11420 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
11430 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
11440 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
11450 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
11460 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
11470 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
11480 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
11490 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
114a0 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
114b0 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
114c0 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
114d0 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
114e0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
114f0 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
11500 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
11510 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
11520 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
11530 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
11540 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
11550 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
11560 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
11570 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
11580 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
11590 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
115a0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
115b0 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
115c0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
115d0 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
115e0 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
115f0 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
11600 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
11610 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  PtrSize];.  pPag
11620 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
11630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11640 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
11650 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
11660 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
11670 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
11680 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
11690 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
116a0 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
116b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
116c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
116d0 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
116e0 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
116f0 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
11700 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
11710 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
11720 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
11730 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
11740 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
11750 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
11760 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
11770 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
11780 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
11790 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
117a0 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
117b0 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d  if( pgno!=pPage-
117c0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
117d0 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
117e0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
117f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50  pDbPage);.    pP
11800 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
11810 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67  DbPage;.    pPag
11820 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
11830 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
11840 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  pgno;.    pPage-
11850 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e  >hdrOffset = pgn
11860 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
11870 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
11880 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  age->aData==sqli
11890 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
118a0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
118b0 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
118c0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
118d0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
118e0 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
118f0 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
11900 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
11910 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
11920 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
11930 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
11940 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
11950 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
11960 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
11970 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
11980 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
11990 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
119a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
119b0 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
119c0 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
119d0 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
119e0 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
119f0 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
11a00 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
11a10 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
11a20 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
11a30 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
11a40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
11a50 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
11a60 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
11a70 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
11a80 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
11a90 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
11aa0 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
11ab0 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
11ac0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
11ad0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
11ae0 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
11af0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
11b00 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
11b10 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
11b20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11b30 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
11b40 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
11b50 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
11b60 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
11b70 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
11b80 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
11b90 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
11ba0 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
11bb0 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
11bc0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
11bd0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
11be0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
11bf0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
11c00 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
11c10 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
11c20 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
11c30 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
11c40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11c50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11c60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
11c70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11c80 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
11c90 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
11ca0 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
11cb0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
11cc0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
11cd0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
11ce0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11cf0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
11d20 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
11d30 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
11d40 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
11d50 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
11d60 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
11d70 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
11d80 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
11d90 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
11da0 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
11db0 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
11dc0 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
11dd0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
11de0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
11df0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
11e00 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
11e10 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11e20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11e30 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11e40 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
11e50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
11e60 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
11e70 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
11e80 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
11e90 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
11ea0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
11eb0 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
11ec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
11ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11ee0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
11ef0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11f00 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
11f10 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
11f20 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
11f30 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
11f40 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
11f50 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
11f60 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
11f70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
11f80 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
11f90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
11fa0 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
11fb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11fc0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
11fd0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
11fe0 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
11ff0 29 26 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30  )&0x80000000)==0
12000 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
12010 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
12020 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
12030 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
12040 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
12050 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
12060 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
12070 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
12080 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
12090 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
120a0 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
120b0 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
120c0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
120d0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
120e0 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
120f0 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
12100 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
12110 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
12120 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
12130 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
12140 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
12150 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
12160 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
12170 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
12180 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
12190 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
121a0 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
121b0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
121c0 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
121d0 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
121e0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
121f0 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
12200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
12210 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
12220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
12250 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
12260 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12280 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
12290 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
122a0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122c0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
122d0 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
122e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
12310 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
12320 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
12330 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12350 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
12360 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
12370 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
12380 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
12390 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
123a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
123b0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
123c0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
123d0 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61  Page==&pCur->pPa
123e0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
123f0 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64  pCur==0 || bRead
12400 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50  Only==pCur->curP
12410 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61  agerFlags );.  a
12420 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
12430 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  | pCur->iPage>0 
12440 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
12450 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
12460 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
12470 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12480 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  PT;.    goto get
12490 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
124a0 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  r;.  }.  rc = sq
124b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
124c0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
124d0 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
124e0 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b  age, bReadOnly);
124f0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12500 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
12510 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
12520 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d    *ppPage = (Mem
12530 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
12540 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
12550 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50  ge);.  if( (*ppP
12560 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
12570 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65  ){.    btreePage
12580 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
12590 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
125a0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
125b0 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  itPage(*ppPage);
125c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
125d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
125e0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
125f0 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  age);.      goto
12600 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
12610 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
12620 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
12630 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
12640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
12650 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d  ppPage)->aData==
12660 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
12670 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
12680 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69  .  /* If obtaini
12690 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20  ng a child page 
126a0 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65  for a cursor, we
126b0 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61   must verify tha
126c0 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  t the page is.  
126d0 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ** compatible wi
126e0 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  th the root page
126f0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20  . */.  if( pCur 
12700 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e  && ((*ppPage)->n
12710 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61  Cell<1 || (*ppPa
12720 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  ge)->intKey!=pCu
12730 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b  r->curIntKey) ){
12740 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12750 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67  _CORRUPT_PGNO(pg
12760 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  no);.    release
12770 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
12780 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
12790 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
127a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
127b0 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69  E_OK;..getAndIni
127c0 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69  tPage_error:.  i
127d0 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 70  f( pCur ){.    p
127e0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
127f0 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
12800 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
12810 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20  r->iPage];.  }. 
12820 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
12830 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12840 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
12850 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
12860 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12870 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
12880 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
12890 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
128a0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
128b0 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
128c0 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a  btreeGetPage..**
128d0 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20 73  .** Page1 is a s
128e0 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20  pecial case and 
128f0 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64  must be released
12900 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61   using releasePa
12910 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  geOne()..*/.stat
12920 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
12930 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
12940 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
12950 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
12960 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
12970 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
12980 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
12990 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
129a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
129b0 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
129c0 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
129d0 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
129e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
129f0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
12a00 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
12a10 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
12a20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12a30 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
12a40 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12a50 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
12a60 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
12a70 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
12a80 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
12a90 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
12aa0 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
12ab0 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
12ac0 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
12ad0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
12ae0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65  eleasePageOne(Me
12af0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
12b00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
12b10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12b20 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
12b30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12b40 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
12b50 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
12b60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12b70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
12b80 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
12b90 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
12ba0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
12bb0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
12bc0 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
12bd0 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
12be0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12bf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12c00 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12c10 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
12c20 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61 67  te3PagerUnrefPag
12c30 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50  eOne(pPage->pDbP
12c40 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
12c50 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
12c60 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
12c70 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
12c80 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
12c90 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
12ca0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
12cb0 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
12cc0 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
12cd0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
12ce0 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
12cf0 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
12d00 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
12d10 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
12d20 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
12d30 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
12d40 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
12d50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
12d60 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
12d70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12d80 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
12d90 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
12da0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
12db0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
12dc0 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
12dd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
12de0 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
12df0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
12e00 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
12e10 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
12e20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
12e30 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
12e40 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
12e50 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
12e60 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
12e70 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
12e80 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
12e90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12ea0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
12eb0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
12ec0 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
12ed0 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
12ee0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12ef0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
12f00 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
12f10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12f20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12f30 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
12f40 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
12f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
12f60 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
12f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
12f80 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
12f90 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
12fa0 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
12fb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
12fc0 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
12fd0 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
12fe0 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
12ff0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
13000 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
13010 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
13020 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
13030 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
13040 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13050 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
13060 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
13070 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
13080 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
13090 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
130a0 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
130b0 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
130c0 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
130d0 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
130e0 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
130f0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
13100 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
13110 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
13120 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
13130 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
13140 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13150 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
13160 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
13170 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
13180 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13190 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
131a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
131b0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
131c0 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
131d0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
131e0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
131f0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
13200 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
13210 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
13220 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
13230 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
13240 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
13250 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
13260 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
13270 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
13280 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
13290 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
132a0 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
132b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
132c0 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
132d0 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
132e0 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
132f0 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
13300 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
13310 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
13320 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
13330 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
13340 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
13350 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
13360 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
13370 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
13380 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
13390 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
133a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
133b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
133c0 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
133d0 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
133e0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
133f0 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
13400 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
13410 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
13420 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
13430 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
13440 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
13450 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13460 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13470 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
13480 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
13490 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
134a0 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
134b0 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20 20  andler,.        
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
134e0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
134f0 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  pPager));.}../*.
13500 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
13510 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
13520 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
13530 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
13540 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
13550 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
13560 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
13570 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
13580 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
13590 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
135a0 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
135b0 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
135c0 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
135d0 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
135e0 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
135f0 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
13600 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
13610 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
13620 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
13630 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
13640 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
13650 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
13660 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
13670 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
13680 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
13690 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
136a0 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
136b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
136c0 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
136d0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
136e0 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
136f0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
13700 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
13710 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
13720 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
13730 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
13740 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
13750 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
13760 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
13770 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
13780 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13790 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
137a0 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
137b0 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
137c0 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
137d0 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
137e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
137f0 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
13800 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
13810 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
13820 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
13830 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13840 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
13850 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
13860 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
13870 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
13880 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
13890 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
138a0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
138b0 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
138c0 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
138d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
138e0 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
138f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
13900 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
13910 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
13920 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
13930 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
13940 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
13950 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
13960 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
13970 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
13980 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
13990 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
139a0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
139b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
139c0 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
139d0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
139e0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
139f0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
13a00 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
13a10 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
13a20 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
13a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
13a40 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
13a50 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
13a60 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a80 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
13a90 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
13aa0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
13ab0 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
13ac0 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
13ad0 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
13ae0 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
13af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13b00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
13b10 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
13b20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
13b30 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b50 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
13b60 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
13b70 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
13b80 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
13b90 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
13ba0 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
13bb0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
13bc0 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
13bd0 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
13be0 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
13bf0 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
13c00 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
13c10 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
13c20 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
13c30 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
13c40 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
13c50 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13c60 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
13c70 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
13c80 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
13c90 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
13ca0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
13cb0 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
13cc0 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
13cd0 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
13ce0 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
13cf0 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
13d00 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
13d10 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13d30 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
13d40 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
13d50 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
13d70 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
13d80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
13d90 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
13da0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
13db0 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
13dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13dd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13de0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
13df0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
13e00 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
13e10 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
13e20 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
13e30 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
13e40 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
13e50 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
13e60 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
13e70 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
13e80 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
13e90 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
13ea0 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
13eb0 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
13ec0 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
13ed0 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
13ee0 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
13ef0 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
13f00 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
13f10 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
13f20 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
13f30 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
13f40 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
13f50 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
13f60 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
13f70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
13f80 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
13f90 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
13fa0 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
13fb0 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
13fc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
13fd0 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
13fe0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
13ff0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
14000 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
14010 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
14020 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14030 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14040 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
14050 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
14060 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
14070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14080 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
14090 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
140a0 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
140b0 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
140c0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
140d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
140e0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
140f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14100 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
14110 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
14120 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
14130 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
14140 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
14150 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
14160 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
14170 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
14180 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
14190 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
141a0 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
141b0 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
141c0 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
141d0 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
141e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
141f0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
14200 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  .      int nFile
14210 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
14220 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
14230 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  )+1;.      int n
14240 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
14250 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
14260 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
14270 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
14280 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58  qlite3Malloc(MAX
14290 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e  (nFullPathname,n
142a0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
142b0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
142c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
142d0 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20  texShared; )..  
142e0 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
142f0 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
14300 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
14310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14320 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
14330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14340 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
14350 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
14360 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
14370 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
14380 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
14390 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
143a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
143b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
143c0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
143d0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
14410 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
14420 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
14430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
14440 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14450 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
14460 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14470 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
14480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
144a0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
144b0 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
144c0 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
144d0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
144e0 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
144f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14500 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
14510 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
14520 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
14530 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14540 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
14550 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
14560 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14570 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
14580 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
14590 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
145a0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
145b0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
145c0 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
145d0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
145e0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
145f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
14600 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
14610 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
14620 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
14630 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
14640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14650 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
14660 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
14670 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
14680 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
14690 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
146a0 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
146b0 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
146c0 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
146d0 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
146e0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
146f0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
14700 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
14710 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14730 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14740 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14760 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14770 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
14780 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14790 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
147a0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
147b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
147c0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
147d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
147e0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
147f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14810 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
14820 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
14830 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
14840 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14850 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14860 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14870 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
14880 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
14890 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
148a0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
148b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
148c0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
148d0 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
148e0 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
148f0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
14900 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
14910 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
14920 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
14930 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
14940 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
14950 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
14960 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
14970 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
14980 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
14990 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
149a0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
149b0 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
149c0 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
149d0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
149e0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
149f0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
14a00 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
14a10 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
14a20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
14a30 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
14a40 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
14a50 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
14a60 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
14a70 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
14a80 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
14a90 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
14aa0 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
14ab0 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
14ac0 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
14ad0 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
14ae0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
14af0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
14b00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14b10 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
14b20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
14b30 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
14b40 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14b50 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
14b60 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14b70 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
14b80 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
14b90 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
14ba0 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
14bb0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
14bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14bd0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
14be0 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
14bf0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
14c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14c10 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
14c20 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
14c30 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
14c60 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
14c70 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
14c80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
14ca0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
14cb0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
14cc0 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
14cd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14ce0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
14cf0 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
14d00 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
14d10 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
14d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14d40 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
14d50 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
14d60 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
14d70 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
14d80 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
14d90 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
14da0 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c  agerSetBusyHandl
14db0 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
14dc0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
14dd0 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
14de0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
14df0 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
14e00 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
14e10 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
14e20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
14e30 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
14e40 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
14e50 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14e60 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20  _READ_ONLY;.#if 
14e70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
14e80 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20  ECURE_DELETE).  
14e90 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
14ea0 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
14eb0 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69  LETE;.#elif defi
14ec0 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f  ned(SQLITE_FAST_
14ed0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
14ee0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14ef0 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54   |= BTS_OVERWRIT
14f00 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  E;.#endif.    /*
14f10 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14f20 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
14f30 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
14f40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
14f50 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
14f60 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
14f70 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
14f80 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
14f90 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
14fa0 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
14fb0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
14fc0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
14fd0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
14fe0 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c   (zDbHeader[16]<
14ff0 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72  <8) | (zDbHeader
15000 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
15010 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
15020 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
15030 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
15040 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
15050 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
15060 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
15070 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
15080 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
15090 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
150a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
150b0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
150c0 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
150d0 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
150e0 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
150f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
15100 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
15110 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
15120 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
15130 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
15140 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
15150 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
15160 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
15170 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
15180 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
15190 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
151a0 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
151b0 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
151c0 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
151d0 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
151e0 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
151f0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
15200 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
15210 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
15220 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
15230 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
15240 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
15250 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
15260 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
15270 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
15280 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
15290 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
152a0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
152b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
152c0 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
152d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
152e0 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
152f0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
15300 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
15310 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d  NCE-OF: R-37497-
15320 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f  42412 The size o
15330 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72  f the reserved r
15340 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a  egion is.      *
15350 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
15360 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
15370 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
15380 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
15390 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20   of 20.      ** 
153a0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
153b0 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
153c0 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  /.      nReserve
153d0 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
153e0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
153f0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
15400 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
15410 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15420 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
15430 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
15440 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
15450 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
15460 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
15470 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
15480 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
15490 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
154a0 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
154b0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
154c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
154d0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
154e0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
154f0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
15500 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
15510 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
15520 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
15530 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
15540 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
15550 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
15560 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
15570 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
15580 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
15590 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
155a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
155b0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
155c0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
155d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
155e0 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
155f0 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
15600 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
15610 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
15620 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
15630 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e     */.    pBt->n
15640 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Ref = 1;.    if(
15650 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
15660 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
15670 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
15680 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
15690 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
156a0 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
156b0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
156c0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
156d0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
156e0 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
156f0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
15700 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15710 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
15720 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
15730 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
15740 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15750 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
15760 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
15770 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
15780 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15790 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
157a0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
157b0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
157c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
157d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
157e0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
157f0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
15800 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
15810 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15820 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
15830 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
15840 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15850 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
15860 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
15870 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15880 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
15890 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
158a0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
158b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
158c0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
158d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
158e0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
158f0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
15900 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
15910 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
15920 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
15930 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
15940 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
15950 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
15960 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
15970 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
15980 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
15990 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
159a0 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
159b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
159c0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
159d0 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
159e0 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
159f0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
15a00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
15a10 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
15a20 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
15a30 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
15a40 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
15a50 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
15a60 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
15a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70  .        if( (up
15a80 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29  tr)p->pBt<(uptr)
15a90 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
15aa0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
15ab0 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
15ac0 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
15ad0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
15ae0 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
15af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15b00 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
15b10 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29  >pNext && (uptr)
15b20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
15b30 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b  <(uptr)p->pBt ){
15b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
15b50 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
15b60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15b70 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
15b80 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
15b90 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
15ba0 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
15bb0 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
15bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15bd0 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
15be0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
15bf0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
15c00 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
15c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
15c20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15c30 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
15c40 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
15c50 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
15c60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15c70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
15c80 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
15c90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15ca0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
15cb0 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  >pPager, 0);.   
15cc0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
15cd0 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
15ce0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
15cf0 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
15d00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
15d10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
15d20 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e;..    /* If th
15d30 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63  e B-Tree was suc
15d40 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
15d50 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d  , set the pager-
15d60 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68  cache size to th
15d70 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
15d80 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
15d90 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20  when opening on 
15da0 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72  an existing shar
15db0 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a  ed pager-cache,.
15dc0 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68      ** do not ch
15dd0 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63  ange the pager-c
15de0 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  ache size..    *
15df0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
15e00 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20  3BtreeSchema(p, 
15e10 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0, 0)==0 ){.    
15e20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
15e30 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42  tCachesize(p->pB
15e40 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54  t->pPager, SQLIT
15e50 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
15e60 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  SIZE);.    }..  
15e70 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    pFile = sqlite
15e80 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
15e90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
15ea0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
15eb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15ec0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
15ed0 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
15ee0 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69  _FCNTL_PDB, (voi
15ef0 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20  d*)&pBt->db);.  
15f00 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
15f10 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
15f20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15f30 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
15f40 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
15f50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15f60 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
15f70 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15f80 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
15f90 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f  e3BtreeConnectio
15fa0 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29  nCount(*ppBtree)
15fb0 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >0 );.  return r
15fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
15fd0 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
15fe0 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
15ff0 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
16000 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
16010 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
16020 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
16030 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
16040 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
16050 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
16060 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
16070 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
16080 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
16090 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
160a0 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
160b0 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
160c0 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
160d0 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
160e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
160f0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55  HARED_CACHE.  MU
16100 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
16110 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
16120 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20  r; ).  BtShared 
16130 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
16140 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
16150 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16160 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
16170 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54  >mutex) );.  MUT
16180 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
16190 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
161a0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
161b0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
161c0 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
161d0 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
161e0 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
161f0 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
16200 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
16210 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
16220 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
16230 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
16240 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
16250 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
16260 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
16270 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
16280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16290 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
162a0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
162b0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
162c0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
162d0 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
162e0 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
162f0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
16300 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
16310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16320 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
16330 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
16340 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
16350 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
16360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
16370 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
16380 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16390 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
163a0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
163b0 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
163c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
163d0 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
163e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
163f0 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
16400 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
16410 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
16420 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
16430 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
16440 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
16450 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
16460 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34  ) bytes with a 4
16470 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72  -byte prefix for
16480 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a   a left-child.**
16490 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
164a0 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
164b0 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
164c0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
164d0 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
164e0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
164f0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
16500 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
16510 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20  >pageSize );..  
16520 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
16530 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d  uses of pBt->pTm
16540 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72  pSpace is to for
16550 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  mat cells before
16560 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e  .    ** insertin
16570 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65  g them into a le
16580 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f  af page (functio
16590 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e  n fillInCell()).
165a0 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c   If.    ** a cel
165b0 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34  l is less than 4
165c0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
165d0 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70  it is rounded up
165e0 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20   to 4 bytes.    
165f0 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ** by the variou
16600 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  s routines that 
16610 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72  manipulate binar
16620 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20  y cells. Which. 
16630 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74     ** can mean t
16640 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  hat fillInCell()
16650 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65   only initialize
16660 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72  s the first 2 or
16670 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20   3.    ** bytes 
16680 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75  of pTmpSpace, bu
16690 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  t that the first
166a0 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70   4 bytes are cop
166b0 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ied from.    ** 
166c0 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61  it into a databa
166d0 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73  se page. This is
166e0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20   not actually a 
166f0 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a  problem, but it.
16700 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73      ** does caus
16710 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72  e a valgrind err
16720 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72  or when the 1 or
16730 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74   2 bytes of unit
16740 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20  ialized .    ** 
16750 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74  data is passed t
16760 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72  o system call wr
16770 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f  ite(). So to avo
16780 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20  id this error,. 
16790 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66     ** zero the f
167a0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
167b0 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e  temp space here.
167c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
167d0 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f  lso:  Provide fo
167e0 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74  ur bytes of init
167f0 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65  ialized space be
16800 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
16810 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d  beginning of pTm
16820 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65  pSpace as an are
16830 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70  a available to p
16840 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a  repend the.    *
16850 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69  * left-child poi
16860 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69  nter to the begi
16870 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e  nning of a cell.
16880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16890 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
168a0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
168b0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30  Bt->pTmpSpace, 0
168c0 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  , 8);.      pBt-
168d0 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b  >pTmpSpace += 4;
168e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
168f0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
16900 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
16910 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
16920 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
16930 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
16940 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  t){.  if( pBt->p
16950 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
16960 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d  pBt->pTmpSpace -
16970 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 4;.    sqlite3
16980 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54  PageFree(pBt->pT
16990 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42  mpSpace);.    pB
169a0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
169b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
169c0 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
169d0 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
169e0 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
169f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16a00 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
16a10 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
16a20 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16a30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
16a40 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
16a50 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
16a60 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
16a70 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16a80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16a90 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
16aa0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16ab0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
16ac0 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
16ad0 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
16ae0 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
16af0 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
16b00 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
16b10 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
16b20 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
16b30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
16b40 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
16b50 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
16b60 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
16b70 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
16b80 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
16b90 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
16ba0 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
16bb0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
16bc0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
16bd0 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
16be0 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
16bf0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
16c00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
16c10 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c  eRollback(p, SQL
16c20 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71  ITE_OK, 0);.  sq
16c30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16c40 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
16c50 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
16c60 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
16c70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
16c80 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
16c90 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
16ca0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
16cb0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
16cc0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
16cd0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
16ce0 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
16cf0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
16d00 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
16d10 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
16d20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
16d30 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
16d40 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
16d50 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
16d60 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
16d70 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
16d80 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
16d90 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
16da0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
16db0 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
16dc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
16dd0 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
16de0 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
16df0 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
16e00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
16e10 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
16e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
16e30 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
16e40 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
16e50 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
16e60 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
16e70 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
16e80 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
16e90 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
16ea0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16eb0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
16ec0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
16ed0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
16ee0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
16ef0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
16f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16f10 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
16f20 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
16f30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
16f40 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
16f50 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
16f60 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
16f70 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
16f80 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
16f90 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16fa0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
16fb0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
16fc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
16fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16fe0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
16ff0 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  oft" limit on th
17000 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
17010 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
17020 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e  ** Unused and un
17030 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77  modified pages w
17040 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20  ill be recycled 
17050 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
17060 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  of.** pages in t
17070 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73  he cache exceeds
17080 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74   this soft limit
17090 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20  .  But the size 
170a0 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  of the.** cache 
170b0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72  is allowed to gr
170c0 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ow larger than t
170d0 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20  his limit if it 
170e0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74  contains.** dirt
170f0 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73  y pages or pages
17100 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65   still in active
17110 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
17120 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
17130 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
17140 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
17150 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17160 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
17170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17180 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17190 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
171a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
171b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
171c0 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
171d0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
171e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
171f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
17200 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17210 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
17220 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74  pill" limit on t
17230 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
17240 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
17250 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
17260 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65  r of pages excee
17270 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75  ds this limit du
17280 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61  ring a write tra
17290 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  nsaction,.** the
172a0 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74   pager might att
172b0 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20  empt to "spill" 
172c0 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  pages to the jou
172d0 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a  rnal early in.**
172e0 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
172f0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  p memory..**.** 
17300 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
17310 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  ed is the curren
17320 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49  t spill size.  I
17330 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64  f zero is passed
17340 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  .** as an argume
17350 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  nt, no changes a
17360 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73  re made to the s
17370 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e  pill size settin
17380 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d  g, so.** using m
17390 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20  xPage of 0 is a 
173a0 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65  way to query the
173b0 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
173c0 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ize..*/.int sqli
173d0 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
173e0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
173f0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
17400 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17410 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b  >pBt;.  int res;
17420 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17430 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17440 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
17450 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17460 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73  er(p);.  res = s
17470 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70  qlite3PagerSetSp
17480 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  illsize(pBt->pPa
17490 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
174a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
174b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
174c0 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  es;.}..#if SQLIT
174d0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
174e0 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  0./*.** Change t
174f0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
17500 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61  amount of the da
17510 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
17520 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72   may be.** memor
17530 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74  y mapped..*/.int
17540 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
17550 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20  MmapLimit(Btree 
17560 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
17570 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53  4 szMmap){.  BtS
17580 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17590 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
175a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
175b0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
175c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
175d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
175e0 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
175f0 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
17600 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71  r, szMmap);.  sq
17610 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17620 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
17630 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
17640 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
17650 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
17660 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17670 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
17680 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
17690 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
176a0 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
176b0 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
176c0 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
176d0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
176e0 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
176f0 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
17700 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
17710 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
17720 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
17730 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
17740 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
17750 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
17760 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
17770 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
17780 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
17790 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
177a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
177b0 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
177c0 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
177d0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
177e0 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
177f0 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
17800 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
17810 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
17820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17830 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
17840 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17850 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20  etPagerFlags(.  
17860 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
17870 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
17880 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
17890 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
178a0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
178b0 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61  lags       /* Va
178c0 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c  rious PAGER_* fl
178d0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ags */.){.  BtSh
178e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
178f0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
17900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17910 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
17920 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17930 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
17940 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
17950 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
17960 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
17970 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17990 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
179a0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
179b0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
179c0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
179d0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
179e0 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
179f0 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
17a00 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
17a10 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
17a20 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17a30 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
17a40 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
17a50 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
17a60 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
17a70 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
17a80 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
17a90 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
17aa0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
17ab0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
17ac0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
17ad0 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
17ae0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
17af0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
17b00 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
17b10 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
17b20 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
17b30 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
17b40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17b50 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
17b60 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
17b70 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
17b80 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
17b90 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
17ba0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
17bb0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
17bc0 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
17bd0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
17be0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
17bf0 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
17c00 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
17c10 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
17c20 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
17c30 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
17c40 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
17c50 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
17c60 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
17c70 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
17c80 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
17c90 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
17ca0 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
17cb0 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
17cc0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
17cd0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
17ce0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
17cf0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
17d00 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
17d10 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
17d20 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
17d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17d40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17d50 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
17d60 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
17d70 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
17d80 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
17d90 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
17da0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
17db0 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  C.  if( nReserve
17dc0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17dd0 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69  erve ) pBt->opti
17de0 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38  malReserve = (u8
17df0 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  )nReserve;.#endi
17e00 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  f.  if( pBt->bts
17e10 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
17e20 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20  SIZE_FIXED ){.  
17e30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17e40 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
17e50 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
17e60 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
17e70 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
17e80 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
17e90 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
17ea0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
17eb0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
17ec0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
17ed0 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
17ee0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
17ef0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
17f00 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
17f10 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
17f20 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
17f30 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
17f40 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
17f50 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
17f60 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
17f70 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
17f80 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29  pageSize = (u32)
17f90 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
17fa0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
17fb0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
17fc0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
17fd0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
17fe0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
17ff0 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70  , nReserve);.  p
18000 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
18010 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
18020 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
18030 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74    if( iFix ) pBt
18040 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18050 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
18060 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18070 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18080 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18090 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
180a0 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
180b0 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
180c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
180d0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
180e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
180f0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
18100 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18110 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
18120 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18130 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70  Reserve(), excep
18140 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79  t that it.** may
18150 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
18160 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
18170 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74  eed that the b-t
18180 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72  ree mutex is alr
18190 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a  eady.** held..**
181a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66  .** This is usef
181b0 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61  ul in one specia
181c0 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61  l case in the ba
181d0 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68  ckup API code wh
181e0 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f  ere it is.** kno
181f0 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72  wn that the shar
18200 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
18210 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65  is held, but the
18220 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a   mutex on the .*
18230 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
18240 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69  e that owns *p i
18250 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63  s not. In this c
18260 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74  ase if sqlite3Bt
18270 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65  reeEnter().** we
18280 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c  re to be called,
18290 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64   it might collid
182a0 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65  e with some othe
182b0 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  r operation on t
182c0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
182d0 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
182e0 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65  *p, causing unde
182f0 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a  fined behavior..
18300 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18310 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
18320 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a  utex(Btree *p){.
18330 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
18340 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18350 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
18360 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d  tex) );.  n = p-
18370 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
18380 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
18390 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ize;.  return n;
183a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
183b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
183c0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
183d0 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
183e0 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
183f0 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
18400 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
18410 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
18420 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
18430 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
18440 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
18450 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  s..**.** If SQLI
18460 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20  TE_HAS_MUTEX is 
18470 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65  defined then the
18480 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
18490 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74   is the.** great
184a0 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  er of the curren
184b0 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  t reserved space
184c0 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
184d0 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65   requested.** re
184e0 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a  serve space..*/.
184f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18500 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76  GetOptimalReserv
18510 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
18520 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
18530 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18540 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
18550 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
18560 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  x(p);.#ifdef SQL
18570 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
18580 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70  if( n<p->pBt->op
18590 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e  timalReserve ) n
185a0 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   = p->pBt->optim
185b0 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  alReserve;.#endi
185c0 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  f.  sqlite3Btree
185d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
185e0 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
185f0 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
18600 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
18610 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
18620 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
18630 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
18640 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
18650 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
18660 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
18670 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
18680 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
18690 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
186a0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
186b0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
186c0 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
186d0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
186e0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
186f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18700 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
18710 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
18720 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
18730 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
18740 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18750 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
18760 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
18770 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
18780 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18790 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
187a0 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a  ITE flags:.**.**
187b0 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20      newFlag==0  
187c0 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45       Both BTS_SE
187d0 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20  CURE_DELETE and 
187e0 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72  BTS_OVERWRITE ar
187f0 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  e cleared.**    
18800 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20  newFlag==1      
18810 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18820 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f  TE set and BTS_O
18830 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65 61  VERWRITE is clea
18840 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  red.**    newFla
18850 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53  g==2       BTS_S
18860 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65  ECURE_DELETE cle
18870 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45  ared and BTS_OVE
18880 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a  RWRITE is set.**
18890 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31      newFlag==(-1
188a0 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a  )    No changes.
188b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
188c0 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75 65  ne acts as a que
188d0 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ry if newFlag is
188e0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a   less than zero.
188f0 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f  **.** With BTS_O
18900 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64 65  VERWRITE set, de
18910 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73  leted content is
18920 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
18930 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72  zeros, but.** fr
18940 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  eelist leaf page
18950 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65  s are not writte
18960 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  n back to the da
18970 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e  tabase.  Thus in
18980 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64  -page.** deleted
18990 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61   content is clea
189a0 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73  red, but freelis
189b0 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  t deleted conten
189c0 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  t is not..**.** 
189d0 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f  With BTS_SECURE_
189e0 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f  DELETE, operatio
189f0 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56  n is like BTS_OV
18a00 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68 65  ERWRITE with the
18a10 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61   addition.** tha
18a20 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20  t freelist leaf 
18a30 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
18a40 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
18a50 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61  database, increa
18a60 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75  sing.** the amou
18a70 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a  nt of disk I/O..
18a80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18a90 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
18aa0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
18ab0 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
18ac0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
18ad0 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
18ae0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18af0 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56    assert( BTS_OV
18b00 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43  ERWRITE==BTS_SEC
18b10 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a  URE_DELETE*2 );.
18b20 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46 41    assert( BTS_FA
18b30 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f  ST_SECURE==(BTS_
18b40 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45  OVERWRITE|BTS_SE
18b50 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a  CURE_DELETE) );.
18b60 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
18b70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
18b80 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
18b90 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20  _FAST_SECURE;.  
18ba0 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
18bb0 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
18bc0 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b  _DELETE*newFlag;
18bd0 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70  .  }.  b = (p->p
18be0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
18bf0 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f  TS_FAST_SECURE)/
18c00 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18c10 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  E;.  sqlite3Btre
18c20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18c30 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn b;.}../*.** 
18c40 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
18c50 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
18c60 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
18c70 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
18c80 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
18c90 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
18ca0 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
18cb0 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
18cc0 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
18cd0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
18ce0 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
18cf0 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
18d00 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
18d10 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
18d20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
18d30 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
18d40 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
18d50 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
18d60 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
18d70 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
18d80 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
18d90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
18da0 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
18db0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
18dc0 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
18dd0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
18de0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18df0 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
18e00 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
18e10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18e20 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
18e30 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
18e40 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
18e50 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
18e60 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
18e70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
18e80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
18e90 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
18ea0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
18eb0 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
18ec0 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
18ed0 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
18ee0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18ef0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
18f00 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
18f10 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
18f20 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
18f30 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
18f40 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
18f50 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
18f60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
18f70 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
18f80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
18f90 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
18fa0 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
18fb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
18fc0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
18fd0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
18fe0 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
18ff0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
19000 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
19010 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
19020 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
19030 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
19040 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
19050 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
19060 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
19070 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
19080 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
19090 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
190a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
190b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
190c0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  if.}../*.** If t
190d0 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20  he user has not 
190e0 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c  set the safety-l
190f0 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61  evel for this da
19100 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19110 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47  n.** using "PRAG
19120 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c  MA synchronous",
19130 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66 65   and if the safe
19140 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20  ty-level is not 
19150 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74  already.** set t
19160 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
19170 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
19180 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ion as the secon
19190 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20  d parameter,.** 
191a0 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69  set it so..*/.#i
191b0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
191c0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51  _SYNCHRONOUS!=SQ
191d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
191e0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20  _SYNCHRONOUS \. 
191f0 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53     && !defined(S
19200 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
19210 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44  static void setD
19220 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42  efaultSyncFlag(B
19230 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38  tShared *pBt, u8
19240 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a   safety_level){.
19250 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
19260 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20   Db *pDb;.  if( 
19270 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20  (db=pBt->db)!=0 
19280 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29  && (pDb=db->aDb)
19290 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  !=0 ){.    while
192a0 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c  ( pDb->pBt==0 ||
192b0 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d   pDb->pBt->pBt!=
192c0 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a  pBt ){ pDb++; }.
192d0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79      if( pDb->bSy
192e0 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26  ncSet==0 .     &
192f0 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65  & pDb->safety_le
19300 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65  vel!=safety_leve
19310 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d  l .     && pDb!=
19320 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20  &db->aDb[1] .   
19330 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73   ){.      pDb->s
19340 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61  afety_level = sa
19350 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20  fety_level;.    
19360 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
19370 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
19380 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  er,.          pD
19390 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
193a0 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50  | (db->flags & P
193b0 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29  AGER_FLAGS_MASK)
193c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
193d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
193e0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
193f0 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65  (pBt,safety_leve
19400 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  l).#endif../* Fo
19410 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
19420 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
19430 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
19440 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  ared*);.../*.** 
19450 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
19460 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
19470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19480 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
19490 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
194a0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
194b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
194c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
194d0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
194e0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
194f0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
19500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
19510 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
19520 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
19530 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
19540 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
19550 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
19560 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
19570 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
19580 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
19590 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
195a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
195b0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
195c0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195e0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
195f0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
19600 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
19610 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
19620 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
19630 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20  e file */.  u32 
19640 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
19650 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19660 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
19670 61 73 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ase */.  u32 nPa
19680 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
19690 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
196a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
196b0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e   file */.  u32 n
196c0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
196d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
196e0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
196f0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
19700 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
19710 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19720 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
19730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
19740 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
19750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19760 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
19770 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
19780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19790 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
197a0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
197b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
197c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
197d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
197e0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
197f0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
19800 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
19810 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
19820 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
19830 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
19840 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
19850 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
19860 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
19870 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
19880 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
19890 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
198a0 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29  ->pPager, (int*)
198b0 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
198c0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
198d0 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
198e0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
198f0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
19900 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
19910 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
19920 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42  e;.  }.  if( (pB
19930 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
19940 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62  QLITE_ResetDatab
19950 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  ase)!=0 ){.    n
19960 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
19970 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
19980 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
19990 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
199a0 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
199b0 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
199c0 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
199d0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
199e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
199f0 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
19a00 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
19a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
19a20 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
19a30 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
19a40 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
19a50 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
19a60 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
19a70 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
19a80 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
19a90 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
19aa0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
19ab0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
19ac0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19ad0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19ae0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
19af0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
19b00 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
19b10 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
19b20 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
19b30 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
19b40 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
19b50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19b60 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19b70 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
19b80 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
19b90 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
19ba0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
19bb0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
19bc0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
19bd0 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
19be0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19bf0 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
19c00 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
19c10 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
19c20 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
19c30 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
19c40 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
19c50 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
19c60 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
19c70 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
19c80 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
19c90 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
19ca0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
19cb0 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
19cc0 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
19cd0 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
19ce0 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
19cf0 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
19d00 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
19d10 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
19d20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
19d30 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
19d40 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
19d50 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
19d60 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
19d70 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
19d80 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
19d90 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
19da0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
19db0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
19dc0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
19dd0 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
19de0 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
19df0 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
19e00 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
19e10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19e20 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
19e30 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
19e40 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
19e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19e60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
19e70 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19e80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19e90 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
19ea0 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
19eb0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
19ec0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
19ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
19ee0 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
19ef0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
19f00 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
19f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19f20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
19f30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
19f40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
19f50 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  DB;.    }else{. 
19f60 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
19f70 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
19f80 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
19f90 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
19fa0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
19fb0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19fc0 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
19fd0 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
19fe0 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
19ff0 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
1a000 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
1a010 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
1a020 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
1a030 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
1a040 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
1a050 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
1a060 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
1a070 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
1a080 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
1a090 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
1a0a0 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
1a0b0 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
1a0c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a0d0 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
1a0e0 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
1a0f0 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
1a100 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a110 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1a120 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a130 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
1a140 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
1a150 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
1a160 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
1a170 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
1a180 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
1a190 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
1a1a0 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
1a1b0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
1a1c0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
1a1d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1a1e0 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
1a1f0 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
1a200 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
1a210 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
1a220 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
1a230 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
1a240 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
1a250 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
1a260 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
1a270 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
1a280 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
1a290 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
1a2a0 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
1a2b0 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
1a2c0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
1a2d0 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
1a2e0 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
1a2f0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1a300 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1a310 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
1a320 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a330 5a 45 5f 46 49 58 45 44 3b 0a 20 20 20 20 61 73  ZE_FIXED;.    as
1a340 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
1a350 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
1a360 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a370 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
1a380 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
1a390 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
1a3a0 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
1a3b0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
1a3c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a3d0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1a3e0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
1a3f0 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
1a400 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
1a410 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
1a420 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
1a430 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
1a440 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
1a450 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
1a460 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
1a470 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1a480 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
1a490 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
1a4a0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1a4b0 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
1a4c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a4d0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
1a4e0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
1a4f0 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
1a500 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
1a510 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
1a520 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1a530 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
1a540 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
1a550 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1a560 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
1a570 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
1a580 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
1a590 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
1a5a0 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
1a5b0 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
1a5c0 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
1a5d0 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
1a5e0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
1a5f0 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1a600 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
1a610 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
1a620 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
1a630 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
1a640 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
1a650 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
1a660 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
1a670 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
1a680 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1a690 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1a6a0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1a6b0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1a6c0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1a6d0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1a6e0 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1a6f0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1a700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a710 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1a720 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1a730 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a760 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1a770 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1a780 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a790 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74 61  if( sqlite3Writa
1a7a0 62 6c 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 64  bleSchema(pBt->d
1a7b0 62 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  b)==0 && nPage>n
1a7c0 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
1a7d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1a7e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1a7f0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a800 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1a810 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a820 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
1a830 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
1a840 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
1a850 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
1a860 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
1a870 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
1a880 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
1a890 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
1a8a0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1a8b0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
1a8c0 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
1a8d0 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
1a8e0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
1a8f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1a900 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a910 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
1a920 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1a930 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
1a940 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
1a950 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
1a960 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1a970 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
1a980 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
1a990 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1a9a0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
1a9b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1a9c0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1a9d0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
1a9e0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
1a9f0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
1aa00 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
1aa10 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
1aa20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
1aa30 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
1aa40 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
1aa50 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
1aa60 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
1aa70 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
1aa80 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
1aa90 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
1aaa0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
1aab0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
1aac0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
1aad0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
1aae0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
1aaf0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
1ab00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1ab10 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
1ab20 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
1ab30 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
1ab40 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
1ab50 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
1ab60 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
1ab70 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
1ab80 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
1ab90 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
1aba0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
1abb0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
1abc0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
1abd0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
1abe0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
1abf0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
1ac00 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
1ac10 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
1ac20 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
1ac30 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
1ac40 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
1ac50 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1ac60 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
1ac70 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
1ac80 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
1ac90 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1aca0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1acb0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
1acc0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
1acd0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
1ace0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
1acf0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
1ad00 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1ad10 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
1ad20 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
1ad30 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
1ad40 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1ad50 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
1ad60 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1ad70 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
1ad80 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
1ad90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1ada0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
1adb0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
1adc0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
1add0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
1ade0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1adf0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1ae00 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
1ae10 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
1ae20 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1ae30 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
1ae40 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
1ae50 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1ae60 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1ae70 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1ae80 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
1ae90 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
1aea0 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
1aeb0 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
1aec0 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
1aed0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
1aee0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
1aef0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
1af00 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
1af10 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
1af20 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
1af30 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
1af40 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
1af50 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1af60 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
1af70 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
1af80 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
1af90 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
1afa0 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
1afb0 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
1afc0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
1afd0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1afe0 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
1aff0 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
1b000 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
1b010 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
1b020 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
1b030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
1b040 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
1b050 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
1b060 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
1b070 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1b080 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
1b090 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
1b0a0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
1b0b0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
1b0c0 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
1b0d0 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
1b0e0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1b0f0 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
1b100 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1b110 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
1b120 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
1b130 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
1b140 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1b150 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
1b160 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
1b170 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
1b180 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
1b190 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
1b1a0 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
1b1b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b1c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1b1d0 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
1b1e0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1b1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b200 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
1b210 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
1b220 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
1b230 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1b240 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
1b250 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1b260 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
1b270 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1b280 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1b290 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1b2a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1b2b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b2c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1b2d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1b2e0 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1b2f0 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
1b300 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
1b310 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
1b320 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
1b330 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1b340 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
1b350 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
1b360 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1b370 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1b380 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1b390 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1b3a0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1b3b0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1b3c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
1b3d0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
1b3e0 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
1b3f0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1b400 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
1b410 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
1b420 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
1b430 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
1b440 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
1b450 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
1b460 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
1b470 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
1b480 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
1b490 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1b4a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
1b4b0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
1b4c0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
1b4d0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
1b4e0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
1b4f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1b500 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b510 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1b520 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
1b530 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
1b540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b550 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
1b560 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
1b570 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
1b580 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
1b590 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
1b5a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
1b5b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1b5c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b5d0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
1b5e0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
1b5f0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
1b600 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
1b610 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1b620 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
1b630 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
1b640 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
1b650 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1b660 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
1b670 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
1b680 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
1b690 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
1b6a0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
1b6b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
1b6c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
1b6d0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1b6e0 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
1b6f0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
1b700 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
1b710 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
1b720 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
1b730 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
1b740 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
1b750 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
1b760 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
1b770 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
1b780 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
1b790 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
1b7a0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
1b7b0 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1b7c0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1b7d0 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
1b7e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b7f0 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
1b800 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1b810 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
1b820 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
1b830 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
1b840 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1b850 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
1b860 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1b870 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
1b880 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1b890 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1b8a0 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
1b8b0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
1b8c0 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
1b8d0 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
1b8e0 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
1b8f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b900 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1b910 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1b920 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b930 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
1b940 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
1b950 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
1b960 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
1b970 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
1b980 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b990 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
1b9a0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1b9b0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1b9c0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1b9d0 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
1b9e0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1b9f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1ba00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
1ba10 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
1ba20 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
1ba30 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
1ba40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ba50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1ba60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
1ba70 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
1ba80 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
1ba90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1baa0 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
1bab0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1bac0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
1bad0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
1bae0 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
1baf0 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1bb00 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1bb10 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
1bb20 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
1bb30 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1bb40 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
1bb50 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
1bb60 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
1bb70 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1bb80 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
1bb90 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
1bba0 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
1bbb0 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
1bbc0 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
1bbd0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
1bbe0 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
1bbf0 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
1bc00 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
1bc10 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
1bc20 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1bc30 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1bc40 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1bc50 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1bc60 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
1bc70 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1bc80 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
1bc90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1bca0 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
1bcb0 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
1bcc0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1bcd0 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
1bce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1bcf0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
1bd00 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1bd10 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
1bd20 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1bd30 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1bd40 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1bd50 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
1bd60 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1bd70 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
1bd80 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1bd90 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
1bda0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1bdb0 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
1bdc0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
1bdd0 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
1bde0 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
1bdf0 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
1be00 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
1be10 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
1be20 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
1be30 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
1be40 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1be50 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
1be60 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
1be70 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
1be80 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
1be90 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
1bea0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1beb0 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
1bec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1bed0 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
1bee0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1bef0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
1bf00 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1bf10 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
1bf20 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
1bf30 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
1bf40 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
1bf50 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
1bf60 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
1bf70 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
1bf80 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1bf90 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
1bfa0 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
1bfb0 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
1bfc0 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
1bfd0 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
1bfe0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1bff0 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
1c000 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
1c010 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
1c020 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
1c030 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
1c040 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
1c050 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
1c060 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
1c070 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
1c080 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
1c090 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
1c0a0 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
1c0b0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1c0c0 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
1c0d0 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
1c0e0 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
1c0f0 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
1c100 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1c110 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
1c120 2c 20 69 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e  , int wrflag, in
1c130 74 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f  t *pSchemaVersio
1c140 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  n){.  BtShared *
1c150 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1c160 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c170 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
1c180 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1c190 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1c1a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1c1b0 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
1c1c0 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
1c1d0 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
1c1e0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
1c1f0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1c200 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
1c210 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1c220 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1c230 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
1c240 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1c250 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c260 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
1c270 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
1c280 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
1c290 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1c2a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1c2b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c2c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1c2d0 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1c2e0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1c2f0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  ==0 );..  if( (p
1c300 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1c310 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
1c320 73 65 29 20 0a 20 20 20 26 26 20 73 71 6c 69 74  se) .   && sqlit
1c330 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
1c340 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  y(pBt->pPager)==
1c350 30 20 0a 20 20 29 7b 0a 20 20 20 20 70 42 74 2d  0 .  ){.    pBt-
1c360 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1c370 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d  S_READ_ONLY;.  }
1c380 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
1c390 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
1c3a0 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
1c3b0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
1c3c0 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  se */.  if( (pBt
1c3d0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1c3e0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26  _READ_ONLY)!=0 &
1c3f0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1c400 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1c410 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
1c420 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
1c430 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c440 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1c450 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  E.  {.    sqlite
1c460 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
1c470 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72     /* If another
1c480 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1c490 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
1c4a0 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
1c4b0 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
1c4c0 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
1c4d0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
1c4e0 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
1c4f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1c500 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65  .    ** requeste
1c510 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
1c520 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a  _LOCKED..    */.
1c530 20 20 20 20 69 66 28 20 28 77 72 66 6c 61 67 20      if( (wrflag 
1c540 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1c550 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1c560 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74  TE).     || (pBt
1c570 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1c580 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20  _PENDING)!=0.   
1c590 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b   ){.      pBlock
1c5a0 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d   = pBt->pWriter-
1c5b0 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >db;.    }else i
1c5c0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
1c5d0 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74       BtLock *pIt
1c5e0 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  er;.      for(pI
1c5f0 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
1c600 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
1c610 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1c620 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
1c630 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
1c640 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1c650 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
1c660 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c670 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1c690 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
1c6a0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1c6b0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1c6c0 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
1c6d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
1c6e0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
1c6f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61  ;.      goto tra
1c700 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a  ns_begun;.    }.
1c710 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1c720 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f   Any read-only o
1c730 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61  r read-write tra
1c740 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73  nsaction implies
1c750 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
1c760 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f  .  ** page 1. So
1c770 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   if some other s
1c780 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65  hared-cache clie
1c790 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  nt already has a
1c7a0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a   write-lock .  *
1c7b0 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  * on page 1, the
1c7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
1c7d0 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a  not be opened. *
1c7e0 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68  /.  rc = querySh
1c7f0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1c800 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
1c810 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  T, READ_LOCK);. 
1c820 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1c830 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f  rc ) goto trans_
1c840 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62  begun;..  pBt->b
1c850 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1c860 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1c870 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
1c880 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46  e==0 ) pBt->btsF
1c890 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54  lags |= BTS_INIT
1c8a0 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64  IALLY_EMPTY;.  d
1c8b0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
1c8c0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
1c8d0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
1c8e0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
1c8f0 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
1c900 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
1c910 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
1c920 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
1c930 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
1c940 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
1c950 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1c960 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
1c970 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
1c980 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
1c990 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
1c9a0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
1c9b0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
1c9c0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
1c9d0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
1c9e0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
1c9f0 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
1ca00 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
1ca10 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
1ca20 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
1ca30 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1ca40 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
1ca50 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
1ca60 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
1ca70 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
1ca80 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
1ca90 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1caa0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1cab0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  g ){.      if( (
1cac0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1cad0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1cae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1caf0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1cb00 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
1cb10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1cb20 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1cb30 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
1cb40 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
1cb50 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
1cb60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1cb70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb80 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
1cb90 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1cba0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1cbb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1cbc0 5f 53 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74  _SNAPSHOT && pBt
1cbd0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1cbe0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1cbf0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74           /* if t
1cc00 68 65 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e  here was no tran
1cc10 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77  saction opened w
1cc20 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1cc30 6e 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20  n was.          
1cc40 2a 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51  ** called and SQ
1cc50 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
1cc60 4f 54 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OT is returned, 
1cc70 63 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72  change the error
1cc80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1cc90 64 65 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53  de to SQLITE_BUS
1cca0 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  Y. */.          
1ccb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ccc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ccd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1cce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ccf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1cd00 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1cd10 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1cd20 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1cd30 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1cd40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1cd50 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1cd60 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1cd70 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1cd80 65 72 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c  er(pBt) );.  sql
1cd90 69 74 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f  ite3PagerResetLo
1cda0 63 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70  ckTimeout(pBt->p
1cdb0 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72  Pager);..  if( r
1cdc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cdd0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1cde0 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1cdf0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1ce00 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
1ce10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ce20 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1ce30 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
1ce40 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
1ce50 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
1ce60 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
1ce70 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
1ce80 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1ce90 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
1cea0 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
1ceb0 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
1cec0 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
1ced0 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
1cee0 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
1cef0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1cf00 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
1cf10 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
1cf20 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
1cf30 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1cf40 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
1cf50 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
1cf60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1cf70 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
1cf80 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1cf90 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
1cfa0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1cfb0 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
1cfc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1cfd0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1cfe0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
1cff0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
1d000 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
1d010 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
1d020 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
1d030 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1d040 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
1d050 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1d060 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
1d070 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1d080 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
1d090 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
1d0a0 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
1d0b0 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
1d0c0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
1d0d0 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
1d0e0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1d0f0 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
1d100 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
1d110 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
1d120 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
1d130 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
1d140 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
1d150 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
1d160 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
1d170 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
1d180 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
1d190 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
1d1a0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
1d1b0 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
1d1c0 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
1d1d0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1d1e0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
1d1f0 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
1d200 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
1d210 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d220 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d230 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1d240 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1d250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d260 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1d270 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1d280 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1d290 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1d2a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d2b0 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
1d2c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d2d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1d2e0 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a  chemaVersion ){.
1d2f0 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65        *pSchemaVe
1d300 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65  rsion = get4byte
1d310 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1d320 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d  Data[40]);.    }
1d330 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1d340 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1d350 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1d360 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1d370 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1d380 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
1d390 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1d3a0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1d3b0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1d3c0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1d3d0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  d.      ** the s
1d3e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
1d3f0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
1d400 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
1d410 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
1d420 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1d430 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1d440 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1d450 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
1d460 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1d470 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  }.  }..  btreeIn
1d480 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1d490 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1d4a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d4b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1d4c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1d4d0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1d4e0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1d4f0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1d500 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1d510 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1d520 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1d530 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1d540 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1d550 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1d560 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1d570 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1d580 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1d590 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1d5a0 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1d5b0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1d5c0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1d5f0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1d600 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d630 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1d640 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1d650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d670 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1d680 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d690 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1d6a0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1d6b0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1d6c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d6d0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1d6e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1d6f0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1d700 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1d710 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1d720 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1d730 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1d740 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  n rc;.  nCell = 
1d750 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1d760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1d770 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1d780 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1d790 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1d7a0 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1d7b0 74 72 28 70 50 61 67 65 2c 20 70 50 61 67 65 2c  tr(pPage, pPage,
1d7c0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1d7d0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1d7e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1d7f0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1d800 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1d810 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1d820 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1d830 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1d840 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1d850 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1d860 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1d870 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1d880 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1d890 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1d8a0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1d8b0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1d8c0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1d8d0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1d8e0 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1d8f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1d900 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
1d910 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1d920 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
1d930 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
1d940 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
1d950 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
1d960 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
1d970 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
1d980 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
1d990 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
1d9a0 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
1d9b0 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
1d9c0 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
1d9d0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1d9e0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d9f0 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
1da20 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1da30 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
1da40 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1da50 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1da60 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
1da70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1da80 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
1da90 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
1daa0 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
1dab0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1dac0 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
1dad0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1dae0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1daf0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
1db00 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
1db10 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
1db20 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1db30 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1db40 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
1db50 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
1db60 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
1db70 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
1db80 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
1db90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1dba0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1dbb0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1dbc0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1dbd0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1dbe0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1dbf0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1dc00 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
1dc10 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
1dc20 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
1dc30 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
1dc40 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
1dc50 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
1dc60 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
1dc70 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
1dc80 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
1dc90 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1dca0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1dcb0 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1dcc0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1dcd0 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1dce0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1dcf0 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1dd00 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   rc;..    rc = p
1dd10 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1dd20 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1dd30 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1dd40 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1dd50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1dd60 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1dd70 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1dd80 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1dd90 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1dda0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1ddb0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1ddc0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1ddd0 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1dde0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1ddf0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1de00 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1de10 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1de20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1de30 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
1de40 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
1de50 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69       if( pCell+i
1de60 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67  nfo.nSize > pPag
1de70 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1de80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1de90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1dea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1deb0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
1dec0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ded0 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
1dee0 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c  m==get4byte(pCel
1def0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20  l+info.nSize-4) 
1df00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1df10 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  ut4byte(pCell+in
1df20 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29  fo.nSize-4, iTo)
1df30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1df40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1df50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1df60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1df70 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
1df80 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
1df90 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1dfa0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
1dfb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dfc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dfd0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1dfe0 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
1dff0 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
1e000 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
1e010 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
1e020 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1e030 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1e040 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
1e050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1e060 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1e070 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
1e080 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1e090 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1e0a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1e0b0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1e0c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1e0d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1e0e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1e0f0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1e100 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1e110 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1e120 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1e130 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1e140 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1e150 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1e160 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1e170 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1e180 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1e190 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1e1a0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1e1b0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1e1c0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1e1d0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1e1e0 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1e1f0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1e200 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1e210 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1e220 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1e230 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1e240 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1e250 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1e260 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1e270 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1e280 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1e290 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1e2a0 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1e2b0 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2d0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1e2e0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1e2f0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1e300 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1e310 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1e320 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1e330 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1e340 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1e350 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1e360 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1e370 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1e380 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e3a0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1e3b0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1e3c0 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1e3d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1e3e0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1e3f0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1e400 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1e410 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1e420 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1e430 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1e440 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1e450 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1e460 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e470 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1e480 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1e490 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1e4a0 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1e4b0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1e4c0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1e4d0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1e4e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e4f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1e500 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1e510 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1e520 3d 3d 70 42 74 20 29 3b 0a 20 20 69 66 28 20 69  ==pBt );.  if( i
1e530 44 62 50 61 67 65 3c 33 20 29 20 72 65 74 75 72  DbPage<3 ) retur
1e540 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e550 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  _BKPT;..  /* Mov
1e560 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
1e570 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
1e580 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
1e590 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
1e5a0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
1e5b0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
1e5c0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
1e5d0 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
1e5e0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
1e5f0 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
1e600 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
1e610 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
1e620 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e630 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
1e640 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
1e650 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
1e660 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
1e670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e680 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e690 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
1e6a0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
1e6b0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
1e6c0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
1e6d0 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
1e6e0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
1e6f0 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
1e700 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
1e710 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1e720 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
1e730 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1e740 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
1e750 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
1e760 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
1e770 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
1e780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
1e790 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
1e7a0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
1e7b0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
1e7c0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
1e7d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1e7e0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1e7f0 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
1e800 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
1e810 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1e820 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
1e830 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1e840 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1e850 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1e860 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1e870 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1e880 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
1e890 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
1e8a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e8c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e8d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
1e8e0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
1e8f0 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
1e900 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
1e910 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
1e920 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1e930 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
1e940 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1e950 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
1e960 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e980 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e9a0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
1e9b0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
1e9c0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
1e9d0 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
1e9e0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
1e9f0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1ea00 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
1ea10 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
1ea20 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
1ea30 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
1ea40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1ea50 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
1ea60 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
1ea70 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ea80 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
1ea90 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1eaa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eab0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1eac0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1ead0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1eae0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
1eaf0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1eb00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1eb10 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1eb20 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1eb30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1eb40 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1eb50 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1eb60 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
1eb70 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
1eb80 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
1eb90 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1eba0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ebb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ebc0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1ebd0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1ebe0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
1ebf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ec00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1ec10 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1ec20 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
1ec30 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
1ec40 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
1ec50 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1ec60 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
1ec70 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
1ec80 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
1ec90 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
1eca0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
1ecb0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1ecc0 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
1ecd0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
1ece0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
1ecf0 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
1ed00 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1ed10 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
1ed20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1ed30 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
1ed40 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1ed50 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
1ed60 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
1ed70 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
1ed80 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1ed90 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1eda0 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
1edb0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
1edc0 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64  e-organize the d
1edd0 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74  atabase so .** t
1ede0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1edf0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
1ee00 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69  rrently in use i
1ee10 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
1ee20 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  se..**.** Parame
1ee30 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20  ter nFin is the 
1ee40 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1ee50 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61  that this databa
1ee60 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  se would contain
1ee70 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75  .** were this fu
1ee80 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e  nction called un
1ee90 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1eea0 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
1eeb0 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74  * If the bCommit
1eec0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1eed0 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
1eee0 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
1eef0 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  at the .** calle
1ef00 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
1ef10 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
1ef20 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65  ep() until it re
1ef30 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1ef40 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f  E .** or an erro
1ef50 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61  r. bCommit is pa
1ef60 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e  ssed true for an
1ef70 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d   auto-vacuum-on-
1ef80 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  commit .** opera
1ef90 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
1efa0 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
1efb0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
1efc0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
1efd0 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
1efe0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
1eff0 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
1f000 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
1f010 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
1f020 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f030 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
1f040 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
1f050 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
1f060 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f070 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1f080 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1f090 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
1f0a0 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
1f0b0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f0c0 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
1f0d0 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
1f0e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f0f0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
1f100 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
1f110 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
1f120 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1f130 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1f140 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
1f150 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
1f160 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f170 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
1f180 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1f190 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
1f1a0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
1f1b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1f1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f1d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f1e0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
1f1f0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1f200 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
1f210 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1f220 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1f230 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1f240 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1f250 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1f260 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1f270 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
1f280 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
1f290 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
1f2a0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1f2b0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
1f2c0 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
1f2d0 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
1f2e0 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
1f2f0 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
1f300 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
1f310 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
1f320 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1f330 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
1f340 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
1f350 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
1f360 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
1f370 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
1f380 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1f390 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1f3a0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1f3b0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1f3c0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1f3d0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1f3e0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1f3f0 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
1f400 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
1f410 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f430 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f450 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
1f460 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
1f470 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f480 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1f490 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
1f4a0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1f4b0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1f4c0 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
1f4d0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
1f4e0 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
1f4f0 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
1f500 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
1f510 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
1f520 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
1f530 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1f540 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1f550 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
1f560 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f570 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
1f580 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1f590 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
1f5a0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
1f5b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
1f5c0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
1f5d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1f5e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f5f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f600 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f610 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
1f620 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
1f630 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
1f640 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
1f650 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
1f660 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
1f670 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1f680 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
1f690 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
1f6a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
1f6b0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
1f6c0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
1f6d0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
1f6e0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
1f6f0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
1f700 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
1f710 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
1f720 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
1f730 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
1f740 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
1f750 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f760 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1f770 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
1f780 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
1f790 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
1f7a0 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
1f7b0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1f7c0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1f7d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1f7e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1f7f0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1f800 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
1f810 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
1f820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f840 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1f850 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
1f860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
1f880 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1f890 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1f8a0 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
1f8b0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
1f8c0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1f8d0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
1f8e0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
1f8f0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
1f900 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
1f910 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
1f920 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
1f930 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f940 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1f950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f960 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1f970 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f980 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1f990 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1f9a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
1f9b0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
1f9c0 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
1f9d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f9e0 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
1f9f0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1fa00 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
1fa10 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1fa20 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
1fa30 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
1fa40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fa50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1fa60 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1fa70 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
1fa80 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
1fa90 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1faa0 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
1fab0 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
1fac0 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
1fad0 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
1fae0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
1faf0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1fb00 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
1fb10 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
1fb20 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
1fb30 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
1fb40 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
1fb50 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
1fb60 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
1fb70 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1fba0 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
1fbb0 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
1fbc0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
1fbf0 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
1fc00 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
1fc10 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fc30 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1fc40 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
1fc50 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
1fc60 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
1fc70 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
1fc80 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
1fc90 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
1fca0 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
1fcb0 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
1fcc0 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
1fcd0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1fce0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
1fcf0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fd00 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1fd10 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
1fd20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1fd30 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
1fd40 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
1fd50 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1fd60 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
1fd70 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
1fd80 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
1fd90 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1fda0 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
1fdb0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1fdc0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
1fdd0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
1fde0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
1fdf0 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
1fe00 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
1fe10 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
1fe20 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
1fe30 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
1fe40 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
1fe50 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
1fe60 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
1fe70 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
1fe80 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
1fe90 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
1fea0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1feb0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1fec0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
1fed0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
1fee0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
1fef0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1ff00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1ff10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ff20 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
1ff30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1ff40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1ff50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ff60 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
1ff70 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1ff80 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
1ff90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1ffa0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ffb0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
1ffc0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
1ffd0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1ffe0 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
1fff0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
20000 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
20010 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
20020 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
20030 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
20040 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
20050 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
20060 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
20070 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20080 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
20090 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
200a0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
200b0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
200c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
200d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
200e0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
200f0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
20100 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
20110 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
20120 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
20130 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
20140 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20170 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
20180 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
20190 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
201a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
201b0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
201c0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
201d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
201e0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
201f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
20200 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20210 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20220 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
20230 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
20240 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
20250 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
20260 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
20270 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
20280 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
20290 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
202a0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
202b0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
202c0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
202d0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
202e0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
202f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
20300 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
20310 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
20320 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
20330 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
20340 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
20350 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
20360 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
20370 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
20380 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
20390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
203a0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
203b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
203c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
203d0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
203e0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
203f0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
20400 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
20410 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
20420 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73  Pager); )..  ass
20430 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20440 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
20450 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
20460 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
20470 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
20480 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
20490 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
204a0 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
204b0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
204c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
204d0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
204e0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
204f0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
20500 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
20510 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20520 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
20530 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
20540 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
20550 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
20560 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
20570 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
20580 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
20590 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
205a0 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
205b0 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
205c0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
205d0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
205e0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
205f0 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
20600 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
20610 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
20620 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
20630 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
20640 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
20650 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
20660 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
20670 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
20680 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
20690 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
206a0 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
206b0 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
206c0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
206d0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
206e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
206f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20700 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20710 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
20720 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
20730 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
20740 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
20750 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
20760 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
20770 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
20780 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20790 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
207a0 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
207b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
207c0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
207d0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
207e0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
207f0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
20800 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
20810 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
20820 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
20830 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
20840 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
20850 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
20860 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
20870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
20880 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
20890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
208a0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
208b0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
208c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
208d0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
208e0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
208f0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
20900 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
20910 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
20920 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
20930 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
20940 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
20950 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
20960 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
20970 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
20980 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
209a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
209b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
209c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
209d0 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
209e0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
209f0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
20a00 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
20a10 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
20a20 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
20a30 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
20a40 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
20a50 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
20a60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20a70 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
20a80 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
20a90 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
20aa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
20ab0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
20ac0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
20ad0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
20ae0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
20af0 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
20b00 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
20b10 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
20b20 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
20b30 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
20b40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
20b50 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
20b60 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
20b70 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
20b80 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
20b90 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
20ba0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
20bb0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
20bc0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
20bd0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
20be0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
20bf0 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
20c00 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
20c10 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
20c20 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
20c30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20c40 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
20c50 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
20c60 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
20c70 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
20c80 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
20c90 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
20ca0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
20cb0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
20cc0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
20cd0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
20ce0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
20cf0 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
20d00 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
20d10 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
20d20 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
20d30 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
20d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
20d50 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
20d60 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
20d70 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
20d80 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
20d90 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
20da0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
20db0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
20dc0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
20dd0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
20de0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
20df0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20e00 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
20e10 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
20e20 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
20e30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
20e40 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
20e50 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
20e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
20e70 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
20e80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
20e90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
20ea0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
20eb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
20ec0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
20ed0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
20ee0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
20ef0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
20f00 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
20f10 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
20f20 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
20f30 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
20f40 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
20f50 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
20f60 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
20f70 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
20f80 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
20f90 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
20fa0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
20fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20fc0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
20fd0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
20fe0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
20ff0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21000 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
21010 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
21020 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
21030 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21040 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
21050 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
21060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21070 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21080 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
21090 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
210a0 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
210b0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
210c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
210d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
210e0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
210f0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
21100 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
21120 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
21130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
21140 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
21150 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
21160 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
21170 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
21180 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
21190 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
211a0 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
211b0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
211c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
211d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
211e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
211f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
21200 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
21210 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
21220 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
21230 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
21240 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
21250 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
21260 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
21270 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
21280 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
21290 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
212a0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
212b0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
212c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
212d0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
212e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
212f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21300 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
21310 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
21320 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
21330 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
21340 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
21350 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
21360 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
21370 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
21380 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
21390 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
213a0 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
213b0 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
213c0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
213d0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
213e0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
213f0 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
21400 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
21410 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
21420 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
21430 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
21440 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
21450 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
21460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
21470 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
21480 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
21490 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
214a0 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
214b0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
214c0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
214d0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
214e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
214f0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
21500 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
21510 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
21520 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
21530 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
21540 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
21550 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
21560 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
21570 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
21580 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
21590 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
215a0 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
215b0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
215c0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
215d0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
215e0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
215f0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
21600 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
21610 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
21620 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
21630 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
21640 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
21650 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
21660 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
21670 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
21680 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
21690 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
216a0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
216b0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
216c0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
216d0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
216e0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
216f0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
21700 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
21710 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
21720 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
21730 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
21740 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
21750 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21760 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
21770 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
21780 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
21790 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
217a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
217b0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
217c0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
217d0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
217e0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
217f0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
21800 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
21810 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
21820 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
21830 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
21840 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
21850 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
21860 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
21870 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
21880 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
21890 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
218a0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
218b0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
218c0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
218d0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
218e0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
218f0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
21900 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
21910 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21920 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
21930 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21940 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
21950 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
21960 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
21970 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
21980 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
21990 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
219a0 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
219b0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
219c0 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
219d0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
219e0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
219f0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
21a00 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
21a10 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
21a20 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
21a30 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
21a40 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
21a50 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
21a60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
21a70 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
21a80 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
21a90 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
21aa0 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
21ab0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
21ac0 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
21ad0 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
21ae0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
21af0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
21b00 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
21b10 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
21b20 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
21b30 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
21b40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
21b50 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
21b60 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
21b70 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
21b80 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
21b90 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
21ba0 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
21bb0 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
21bc0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
21bd0 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
21be0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
21bf0 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
21c00 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
21c10 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
21c20 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
21c30 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
21c40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
21c50 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
21c60 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
21c70 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
21c80 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
21c90 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
21ca0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21cb0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
21cc0 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
21cd0 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
21ce0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
21cf0 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
21d00 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
21d10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21d20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
21d30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
21d40 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
21d50 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
21d60 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
21d70 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
21d80 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
21d90 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
21da0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
21db0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
21dc0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
21dd0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
21de0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
21df0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21e00 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
21e10 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
21e20 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
21e30 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
21e40 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
21e50 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
21e60 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
21e70 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
21e80 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
21e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21ea0 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
21eb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
21ec0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21ed0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21ee0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74     }.    p->iDat
21ef0 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20  aVersion--;  /* 
21f00 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70  Compensate for p
21f10 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
21f20 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42  ion++; */.    pB
21f30 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21f40 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
21f50 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
21f60 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
21f70 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
21f80 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
21f90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21fa0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
21fb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21fc0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
21fd0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
21fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21ff0 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
22000 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
22010 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
22020 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
22030 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
22040 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
22050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22060 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
22070 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
22080 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
22090 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
220a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
220b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
220c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
220d0 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
220e0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
220f0 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
22100 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
22110 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
22120 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20  on any BtShared 
22130 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
22140 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69  eferences.  Or i
22150 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
22160 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31  flag is set to 1
22170 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74  , then only.** t
22180 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72  rip write cursor
22190 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64  s and leave read
221a0 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67   cursors unchang
221b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  ed..**.** Every 
221c0 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64  cursor is a cand
221d0 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70  idate to be trip
221e0 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
221f0 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62  ursors.** that b
22200 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64  elong to other d
22210 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22220 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
22230 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67  to be.** sharing
22240 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
22250 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
22260 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
22270 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
22280 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49  llback occurs. I
22290 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a  f the writeOnly.
222a0 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ** flag is true,
222b0 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
222c0 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65  -cursors need be
222d0 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d   tripped - read-
222e0 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
222f0 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65  save their curre
22300 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20  nt positions so 
22310 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f  that they may co
22320 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ntinue .** follo
22330 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  wing the rollbac
22340 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f  k. Or, if writeO
22350 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c  nly is false, al
22360 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a  l cursors are .*
22370 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65  * tripped. In ge
22380 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79  neral, writeOnly
22390 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
223a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
223b0 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ng.** rolled bac
223c0 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  k modified the d
223d0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
223e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74  In this case b-t
223f0 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ree root.** page
22400 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f  s may be moved o
22410 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
22420 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f  he database alto
22430 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a  gether, making.*
22440 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20  * it unsafe for 
22450 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20  read cursors to 
22460 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
22470 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
22480 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e   flag is true an
22490 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  d an error is en
224a0 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
224b0 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63  .** saving the c
224c0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
224d0 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  of a read-only c
224e0 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f  ursor, all curso
224f0 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  rs, .** includin
22500 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f  g all read-curso
22510 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a  rs are tripped..
22520 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
22530 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
22540 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
22550 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22560 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67   while.** saving
22570 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
22580 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on, an SQLite er
22590 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
225a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
225b0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
225c0 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
225d0 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  rrCode, int writ
225e0 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  eOnly){.  BtCurs
225f0 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20  or *p;.  int rc 
22600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22610 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e  assert( (writeOn
22620 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==0 || writeOn
22630 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57  ly==1) && BTCF_W
22640 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  riteFlag==1 );. 
22650 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
22660 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
22670 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
22680 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
22690 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
226a0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
226b0 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
226c0 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
226d0 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
226e0 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
226f0 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
22700 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
22710 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
22720 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
22730 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
22740 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
22750 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
22760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22780 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
22790 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
227a0 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
227b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
227c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
227d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
227e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
227f0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
22800 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
22810 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
22820 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
22830 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
22840 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
22850 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52    }.      btreeR
22860 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
22870 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20  ages(p);.    }. 
22880 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
22890 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
228a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
228b0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
228c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
228d0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
228e0 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
228f0 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
22900 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
22910 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
22920 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
22930 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
22940 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
22950 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
22960 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
22970 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
22980 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
22990 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
229a0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
229b0 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
229c0 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
229d0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
229e0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
229f0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
22a00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
22a10 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
22a20 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
22a30 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
22a40 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
22a50 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
22a60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
22a70 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
22a80 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
22a90 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
22aa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
22ab0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22ac0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
22ad0 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
22ae0 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
22af0 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
22b00 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
22b10 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
22b20 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
22b30 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
22b40 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
22b50 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
22b60 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
22b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22b80 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
22b90 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
22ba0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
22bb0 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
22bc0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22bd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
22be0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
22bf0 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
22c00 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
22c10 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
22c20 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
22c30 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
22c40 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22c50 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
22c60 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
22c70 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
22c80 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
22c90 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
22ca0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
22cb0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
22cc0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22cd0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
22ce0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
22cf0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
22d00 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
22d10 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
22d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
22d30 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
22d40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
22d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22d60 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
22d70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
22d80 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
22d90 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
22da0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
22db0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
22dc0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
22dd0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
22de0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
22df0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
22e00 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
22e10 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
22e20 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
22e30 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
22e40 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
22e50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
22e60 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
22e70 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
22e80 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
22e90 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
22ea0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
22eb0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
22ec0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
22ed0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
22ee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22ef0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
22f00 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
22f10 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
22f20 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
22f30 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20  geOne(pPage1);. 
22f40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22f50 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
22f60 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
22f70 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
22f80 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
22f90 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
22fa0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
22fb0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
22fc0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
22fd0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
22fe0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
22ff0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23000 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
23010 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
23020 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
23030 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f  action can be ro
23040 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
23050 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
23060 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
23070 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
23080 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
23090 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
230a0 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
230b0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
230c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
230d0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
230e0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
230f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
23100 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
23110 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
23120 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
23130 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
23140 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
23150 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
23160 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
23170 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
23180 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
23190 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
231a0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
231b0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
231c0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
231d0 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
231e0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
231f0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
23200 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
23210 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
23220 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
23230 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
23240 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
23250 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
23260 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
23270 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
23280 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
23290 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
232a0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
232b0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
232c0 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
232d0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
232e0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
232f0 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
23300 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
23310 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
23320 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
23330 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
23340 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
23350 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
23360 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
23370 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
23380 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
23390 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
233a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
233b0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
233c0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
233d0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
233e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
233f0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
23400 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
23410 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
23420 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23430 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
23440 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
23450 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
23460 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
23470 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
23480 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
23490 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
234a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
234b0 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
234c0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
234d0 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
234e0 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
234f0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
23500 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
23510 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
23520 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
23530 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
23540 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
23550 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
23560 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
23570 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
23580 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
23590 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
235a0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
235b0 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
235c0 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
235d0 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
235e0 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
235f0 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
23600 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
23610 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
23620 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
23630 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
23640 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
23650 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
23660 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71  Statement);.  sq
23670 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23680 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
23690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
236a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
236b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
236c0 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
236d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
236e0 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
236f0 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
23700 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
23710 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
23720 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
23730 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
23740 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
23750 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
23760 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
23770 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
23780 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
23790 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
237a0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
237b0 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
237c0 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
237d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
237e0 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
237f0 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
23800 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
23810 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
23820 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
23830 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
23840 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
23850 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
23860 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
23870 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
23880 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
23890 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
238a0 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
238b0 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
238c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
238d0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
238e0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
238f0 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
23900 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23910 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
23920 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23930 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
23940 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
23950 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
23960 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
23970 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
23980 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
23990 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
239a0 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
239b0 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
239c0 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
239d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
239e0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
239f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
23a00 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
23a10 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
23a20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
23a30 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
23a40 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
23a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
23a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
23a80 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
23a90 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
23aa0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
23ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23ac0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
23ad0 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
23ae0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
23af0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
23b00 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
23b10 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
23b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23b30 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
23b40 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
23b50 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
23b60 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
23b70 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
23b80 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23b90 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
23ba0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
23bb0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
23bc0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
23bd0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
23be0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
23bf0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
23c00 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
23c10 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
23c20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
23c30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
23c40 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
23c50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23c60 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
23c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23c80 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
23c90 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
23ca0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
23cb0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
23cc0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
23cd0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
23ce0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
23cf0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
23d00 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
23d10 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
23d20 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
23d30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
23d40 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
23d50 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
23d60 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
23d70 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
23d80 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
23d90 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
23da0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
23db0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23dc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45  *.** If the BTRE
23dd0 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77  E_WRCSR bit of w
23de0 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20  rFlag is clear, 
23df0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23e00 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75  can only.** be u
23e10 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
23e20 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57    If the BTREE_W
23e30 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c  RCSR bit is set,
23e40 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23e50 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
23e60 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
23e70 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  or writing if ot
23e80 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
23e90 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72  or writing.** ar
23ea0 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
23eb0 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  se are the condi
23ec0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
23ed0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a  be met in order.
23ee0 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  ** for writing t
23ef0 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  o be allowed:.**
23f00 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
23f10 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
23f20 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
23f30 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Flag containing 
23f40 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a  BTREE_WRCSR.**.*
23f50 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
23f60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
23f70 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
23f80 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
23f90 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
23fa0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
23fb0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
23fc0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
23fd0 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
23fe0 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
23ff0 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
24000 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
24010 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
24020 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
24030 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
24040 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
24050 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
24060 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
24070 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
24080 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
24090 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
240a0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
240b0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
240c0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
240d0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
240e0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
240f0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
24100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45  .**.** The BTREE
24110 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f  _FORDELETE bit o
24120 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74  f wrFlag may opt
24130 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69  ionally be set i
24140 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  f BTREE_WRCSR.**
24150 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52   is set.  If FOR
24160 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74  DELETE is set, t
24170 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
24180 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
24190 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  ion that.** this
241a0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c   cursor will onl
241b0 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65  y be used to see
241c0 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20  k to and delete 
241d0 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e  entries of an in
241e0 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  dex.** as part o
241f0 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54  f a larger DELET
24200 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
24210 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74  e FORDELETE hint
24220 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a   is not used by.
24230 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  ** this implemen
24240 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20  tation.  But in 
24250 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61  a hypothetical a
24260 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61  lternative stora
24270 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e  ge engine .** in
24280 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74   which index ent
24290 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ries are automat
242a0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
242b0 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  hen correspondin
242c0 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20  g table.** rows 
242d0 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65  are deleted, the
242e0 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20   FORDELETE flag 
242f0 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61  is a hint that a
24300 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45  ll SEEK and DELE
24310 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  TE.** operations
24320 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
24330 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e  can be no-ops an
24340 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61  d all READ opera
24350 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65  tions can .** re
24360 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20  turn a null row 
24370 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30  (2-bytes: 0x01 0
24380 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  x00)..**.** No c
24390 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
243a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
243b0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
243c0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
243d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
243e0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
243f0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
24400 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
24410 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
24420 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
24430 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
24440 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
24450 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
24460 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
24470 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
24480 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
24490 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
244a0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
244b0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
244c0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
244d0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24500 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
24510 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24530 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
24540 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
24550 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
24560 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
24590 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
245a0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
245b0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
245c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
245d0 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
245e0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
245f0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
24620 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
24630 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
24640 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24660 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
24670 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75  handle */.  BtCu
24680 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20  rsor *pX;       
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76     /* Looping ov
246b0 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72  er other all cur
246c0 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sors */..  asser
246d0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
246e0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
246f0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
24700 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  ==0 .       || w
24710 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43  rFlag==BTREE_WRC
24720 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  SR .       || wr
24730 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43  Flag==(BTREE_WRC
24740 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  SR|BTREE_FORDELE
24750 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  TE) .  );..  /* 
24760 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
24770 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
24780 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
24790 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
247a0 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
247b0 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
247c0 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
247d0 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
247e0 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
247f0 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
24800 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
24810 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
24820 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
24830 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
24840 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
24850 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
24860 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
24870 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
24880 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32  fo!=0, (wrFlag?2
24890 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  :1)) );.  assert
248a0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
248b0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
248c0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
248d0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
248e0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
248f0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
24900 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
24910 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
24920 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
24930 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
24940 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
24950 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
24960 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
24970 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
24980 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
24990 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
249a0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28  ( wrFlag==0 || (
249b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
249c0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
249d0 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c  0 );..  if( wrFl
249e0 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
249f0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
24a00 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
24a10 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
24a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24a30 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  M_BKPT;.  }.  if
24a40 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
24a50 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
24a60 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
24a70 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
24a80 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
24a90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
24aa0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
24ab0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
24ac0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
24ad0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
24ae0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
24af0 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
24b00 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
24b10 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
24b20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
24b30 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
24b40 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
24b50 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
24b60 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
24b70 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
24b80 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
24b90 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63  = pBt;.  pCur->c
24ba0 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
24bb0 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   ? BTCF_WriteFla
24bc0 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  g : 0;.  pCur->c
24bd0 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77  urPagerFlags = w
24be0 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45  rFlag ? 0 : PAGE
24bf0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a  R_GET_READONLY;.
24c00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
24c10 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
24c20 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
24c30 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
24c40 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73  l such.  ** curs
24c50 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20  ors *must* have 
24c60 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
24c70 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20  e flag set. */. 
24c80 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75   for(pX=pBt->pCu
24c90 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d  rsor; pX; pX=pX-
24ca0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
24cb0 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28   pX->pgnoRoot==(
24cc0 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20  Pgno)iTable ){. 
24cd0 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67       pX->curFlag
24ce0 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
24cf0 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  le;.      pCur->
24d00 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
24d10 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d  _Multiple;.    }
24d20 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65  .  }.  pCur->pNe
24d30 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
24d40 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  r;.  pBt->pCurso
24d50 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
24d60 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
24d70 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74  R_INVALID;.  ret
24d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24d90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24da0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
24db0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
24de0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
24df0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
24e20 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
24e30 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
24e40 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
24e70 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
24e80 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
24e90 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
24ec0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
24ed0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24f00 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
24f10 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
24f20 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c   rc;.  if( iTabl
24f30 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  e<1 ){.    rc = 
24f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24f50 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
24f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24f70 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
24f80 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
24f90 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
24fa0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
24fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
24fc0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
24fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24fe0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24ff0 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
25000 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
25010 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
25020 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
25030 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
25040 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
25050 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
25060 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
25070 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
25080 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
25090 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
250a0 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
250b0 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
250c0 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
250d0 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
250e0 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
250f0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
25100 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
25110 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
25120 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
25130 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
25140 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
25150 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
25160 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
25170 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
25180 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
25190 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
251a0 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
251b0 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
251c0 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
251d0 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
251e0 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
251f0 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
25200 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
25210 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
25220 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
25230 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
25240 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
25250 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
25260 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
25270 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
25280 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
25290 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
252a0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
252b0 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
252c0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
252d0 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
252e0 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55  f(BtCursor, BTCU
252f0 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49  RSOR_FIRST_UNINI
25300 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  T));.}../*.** Cl
25310 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
25320 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
25330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25340 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
25350 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
25360 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
25370 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25380 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
25390 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
253a0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
253b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
253c0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
253d0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
253e0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
253f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
25400 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
25410 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
25420 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
25430 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
25440 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  or==pCur ){.    
25450 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
25460 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
25470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
25480 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d  tCursor *pPrev =
25490 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
254a0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
254b0 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78   if( pPrev->pNex
254c0 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  t==pCur ){.     
254d0 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78       pPrev->pNex
254e0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
254f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
25500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25510 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65      pPrev = pPre
25520 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  v->pNext;.      
25530 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70  }while( ALWAYS(p
25540 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Prev) );.    }. 
25550 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
25560 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
25570 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ur);.    unlockB
25580 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
25590 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
255a0 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
255b0 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  low);.    sqlite
255c0 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
255d0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  y);.    sqlite3B
255e0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
255f0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 42 74  );.    pCur->pBt
25600 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ree = 0;.  }.  r
25610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
25630 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
25640 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
25650 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
25660 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
25670 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
25680 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
25690 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
256a0 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
256b0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
256c0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
256d0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
256e0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
256f0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
25700 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
25710 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
25720 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
25730 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
25740 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
25750 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
25760 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  UG.  static int 
25770 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65  cellInfoEqual(Ce
25780 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49  llInfo *a, CellI
25790 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28  nfo *b){.    if(
257a0 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65   a->nKey!=b->nKe
257b0 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
257c0 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61    if( a->pPayloa
257d0 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29  d!=b->pPayload )
257e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
257f0 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d  f( a->nPayload!=
25800 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65  b->nPayload ) re
25810 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
25820 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c  a->nLocal!=b->nL
25830 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  ocal ) return 0;
25840 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a  .    if( a->nSiz
25850 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65  e!=b->nSize ) re
25860 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75  turn 0;.    retu
25870 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74  rn 1;.  }.  stat
25880 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
25890 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
258a0 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
258b0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d  Info info;.    m
258c0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
258d0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
258e0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
258f0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
25900 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b  Cur->ix, &info);
25910 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
25920 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49  RUPT_DB || cellI
25930 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20  nfoEqual(&info, 
25940 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a  &pCur->info) );.
25950 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
25960 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
25970 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
25980 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
25990 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
259a0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
259b0 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
259c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
259d0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  ){.    pCur->cur
259e0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
259f0 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72  lidNKey;.    btr
25a00 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
25a10 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78  ->pPage,pCur->ix
25a20 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
25a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
25a40 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
25a50 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
25a60 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
25a70 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
25a80 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
25a90 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
25aa0 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
25ab0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
25ac0 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
25ad0 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
25ae0 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
25af0 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
25b00 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
25b10 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
25b20 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
25b30 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
25b40 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
25b50 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
25b60 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
25b70 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
25b80 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
25b90 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
25ba0 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
25bb0 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
25bc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25bd0 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
25be0 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74  /* NDEBUG */.int
25bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
25c00 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43  sorIsValidNN(BtC
25c10 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25c20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
25c30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
25c40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25c50 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
25c60 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
25c70 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
25c80 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20   key or "rowid" 
25c90 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65  for a table btre
25ca0 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
25cb0 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64  ne is only valid
25cc0 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
25cd0 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
25ce0 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72  nto a.** ordinar
25cf0 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20  y table btree.  
25d00 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  If the cursor po
25d10 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78  ints to an index
25d20 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20   btree or.** is 
25d30 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73  invalid, the res
25d40 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ult of this rout
25d50 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ine is undefined
25d60 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
25d70 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
25d80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25d90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25da0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25db0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25dc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25dd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
25de0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
25df0 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43  IntKey );.  getC
25e00 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
25e10 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e   return pCur->in
25e20 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64  fo.nKey;.}..#ifd
25e30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
25e40 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
25e50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25e60 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  e offset into th
25e70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25e80 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
25e90 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20   the.** payload 
25ea0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
25eb0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e  sor is pointing.
25ec0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
25ed0 74 72 65 65 4f 66 66 73 65 74 28 42 74 43 75 72  treeOffset(BtCur
25ee0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
25ef0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25f00 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25f10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25f20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25f30 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
25f40 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25f50 65 74 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d  eturn (i64)pCur-
25f60 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  >pBt->pageSize*(
25f70 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65  (i64)pCur->pPage
25f80 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20  ->pgno - 1) +.  
25f90 20 20 20 20 20 20 20 28 69 36 34 29 28 70 43 75         (i64)(pCu
25fa0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
25fb0 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   - pCur->pPage->
25fc0 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66  aData);.}.#endif
25fd0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
25fe0 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e  E_OFFSET_SQL_FUN
25ff0 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  C */../*.** Retu
26000 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
26010 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
26020 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  d for the entry 
26030 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
26040 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
26050 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c  ng to.  For tabl
26060 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  e btrees, this w
26070 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e  ill be the amoun
26080 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46  t.** of data.  F
26090 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c  or index btrees,
260a0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
260b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65  e size of the ke
260c0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
260d0 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
260e0 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
260f0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
26100 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
26110 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
26120 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
26130 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
26140 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
26150 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
26160 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
26170 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
26180 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71  VALID..*/.u32 sq
26190 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
261a0 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  dSize(BtCursor *
261b0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
261c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
261d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
261e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
261f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
26200 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
26210 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
26220 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
26230 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  load;.}../*.** R
26240 65 74 75 72 6e 20 61 6e 20 75 70 70 65 72 20 62  eturn an upper b
26250 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ound on the size
26260 20 6f 66 20 61 6e 79 20 72 65 63 6f 72 64 20 66   of any record f
26270 6f 72 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  or the table.** 
26280 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
26290 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
262a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
262b0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
262c0 20 20 45 76 65 72 79 74 68 69 6e 67 20 77 69 6c    Everything wil
262d0 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  l still work if 
262e0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
262f0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 32  always returns 2
26300 31 34 37 34 38 33 36 34 37 20 28 77 68 69 63 68  147483647 (which
26310 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
26320 72 65 63 6f 72 64 0a 2a 2a 20 74 68 61 74 20 53  record.** that S
26330 51 4c 69 74 65 20 63 61 6e 20 68 61 6e 64 6c 65  QLite can handle
26340 29 20 6f 72 20 6d 6f 72 65 2e 20 20 42 75 74 20  ) or more.  But 
26350 72 65 74 75 72 6e 69 6e 67 20 61 20 73 6d 61 6c  returning a smal
26360 6c 65 72 20 76 61 6c 75 65 20 6d 69 67 68 74 0a  ler value might.
26370 2a 2a 20 70 72 65 76 65 6e 74 20 6c 61 72 67 65  ** prevent large
26380 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
26390 6f 6e 73 20 77 68 65 6e 20 74 72 79 69 6e 67 20  ons when trying 
263a0 74 6f 20 69 6e 74 65 72 70 72 65 74 20 61 0a 2a  to interpret a.*
263b0 2a 20 63 6f 72 72 75 70 74 20 64 61 74 72 61 62  * corrupt datrab
263c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ase..**.** The c
263d0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
263e0 61 74 69 6f 6e 20 6d 65 72 65 6c 79 20 72 65 74  ation merely ret
263f0 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  urns the size of
26400 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
26410 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
26420 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
26430 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  64 sqlite3BtreeM
26440 61 78 52 65 63 6f 72 64 53 69 7a 65 28 42 74 43  axRecordSize(BtC
26450 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26460 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26470 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26490 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
264a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 65 74 75  _VALID );.  retu
264b0 72 6e 20 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  rn pCur->pBt->pa
264c0 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
264d0 33 5f 69 6e 74 36 34 29 70 43 75 72 2d 3e 70 42  3_int64)pCur->pB
264e0 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a  t->nPage;.}../*.
264f0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
26500 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
26510 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
26520 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
26530 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
26540 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
26550 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
26560 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
26570 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
26580 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
26590 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
265a0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
265b0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
265c0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
265d0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
265e0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
265f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
26600 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
26610 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
26620 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
26630 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
26640 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
26650 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
26660 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
26670 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
26680 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
26690 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
266a0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
266b0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
266c0 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
266d0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
266e0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
266f0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
26700 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
26710 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
26720 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
26730 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
26740 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
26750 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
26760 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
26770 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
26780 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
26790 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
267a0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
267b0 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
267c0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
267d0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
267e0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
267f0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
26800 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
26810 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
26820 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
26830 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
26840 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
26850 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
26860 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
26870 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
26880 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
26890 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
268a0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
268b0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
268c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
268d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
268e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
268f0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
26920 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
26930 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
26940 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
26950 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
26960 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
26970 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
26980 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
26990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
269a0 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
269b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
269c0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
269d0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
269e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
269f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26a00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26a10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
26a20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
26a30 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
26a40 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
26a50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26a60 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
26a70 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
26a80 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
26a90 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
26aa0 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
26ab0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
26ac0 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
26ad0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
26ae0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
26af0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
26b00 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
26b10 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
26b20 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
26b30 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
26b40 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
26b50 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
26b60 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
26b70 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
26b80 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
26b90 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
26ba0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26bb0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
26bc0 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
26bd0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
26be0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
26bf0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
26c00 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
26c10 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
26c20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26c30 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
26c40 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
26c50 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
26c60 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
26c70 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
26c80 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
26c90 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
26ca0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
26cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26cc0 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
26cd0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
26ce0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
26cf0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
26d00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
26d10 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
26d20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
26d30 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
26d40 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
26d50 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
26d60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26d70 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
26d80 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
26d90 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
26da0 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
26db0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
26dc0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
26dd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
26de0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
26df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
26e10 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
26e20 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
26e30 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
26e40 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
26e50 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
26e60 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
26e70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
26e80 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
26e90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
26ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
26eb0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
26ec0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
26ed0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
26ee0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
26ef0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
26f00 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
26f10 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
26f20 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
26f30 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
26f40 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
26f50 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
26f60 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
26f70 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
26f80 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
26f90 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
26fa0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
26fb0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
26fc0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
26fd0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
26fe0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
26ff0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
27000 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
27010 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
27020 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
27030 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
27040 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
27050 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
27060 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
27070 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
27080 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
27090 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
270a0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
270b0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
270c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
270d0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
270e0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
270f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27100 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
27110 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
27140 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
27150 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
27160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
27170 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
27180 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
27190 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
271a0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
271b0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
271c0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
271d0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
271e0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
271f0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
27200 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
27210 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
27220 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
27230 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
27240 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
27250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27260 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
27270 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
27280 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
27290 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
272a0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
272b0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
272c0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
272d0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
272e0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
272f0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
27300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
27310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27320 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27330 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
27340 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
27350 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
27360 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
27370 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
27380 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
27390 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
273a0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
273b0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
273c0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
273d0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
273e0 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
273f0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
27400 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
27410 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
27420 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
27430 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
27440 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
27450 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
27460 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
27470 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
27480 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
27490 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
274a0 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
274b0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
274c0 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
274d0 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
274e0 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
274f0 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
27500 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
27510 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
27520 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
27530 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
27540 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
27550 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
27560 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
27570 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ages.** this fun
27580 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
27590 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
275a0 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
275b0 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  .** the overflow
275c0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
275d0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
275e0 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
275f0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
27600 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
27610 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
27620 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
27630 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
27640 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
27650 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
27660 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
27670 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
27680 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62  cated, it must b
27690 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
276a0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
276b0 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
276c0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
276d0 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
276e0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
276f0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
27700 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
27710 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
27720 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
27730 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
27740 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
27750 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27760 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
27770 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
27780 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
27790 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
277a0 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
277b0 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
277c0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
277d0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
277e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
277f0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
27800 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
27810 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
27820 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
27830 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
27840 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
27850 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
27860 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
27870 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
27880 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
27890 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
278a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
278b0 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
278c0 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
278d0 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
278e0 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
278f0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
27900 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27920 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
27930 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
27940 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
27950 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
27960 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
27970 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
27980 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
27990 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
279a0 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >pPage;         
279b0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70        /* Btree p
279c0 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
279d0 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
279e0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
279f0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
27a00 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
27a10 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
27a20 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
27a30 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
27a40 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
27a50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
27a60 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
27a70 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61  pBuf;     /* Sta
27a80 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f  rt of original o
27a90 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e  ut buffer */.#en
27aa0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
27ab0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
27ac0 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d  ( eOp==0 || eOp=
27ad0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
27ae0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27af0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27b00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
27b10 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
27b20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27b30 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27b40 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
27b50 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
27b60 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
27b70 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61  fo.pPayload;.  a
27b80 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
27b90 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
27ba0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61  nPayload );..  a
27bb0 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20  ssert( aPayload 
27bc0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  > pPage->aData )
27bd0 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61  ;.  if( (uptr)(a
27be0 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d  Payload - pPage-
27bf0 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e  >aData) > (pBt->
27c00 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75  usableSize - pCu
27c10 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  r->info.nLocal) 
27c20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
27c30 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
27c40 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
27c50 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
27c60 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20   error.  The.   
27c70 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   ** conditional 
27c80 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a  above is really:
27c90 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79  .    **    &aPay
27ca0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
27cb0 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
27cc0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
27cd0 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20  bleSize].    ** 
27ce0 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e  but is recast in
27cf0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66  to its current f
27d00 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74  orm to avoid int
27d10 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72  eger overflow pr
27d20 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20  oblems.    */.  
27d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d40 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
27d50 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ge);.  }..  /* C
27d60 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
27d70 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
27d80 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
27d90 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
27da0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
27db0 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
27dc0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
27dd0 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
27de0 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
27df0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
27e00 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
27e10 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
27e20 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
27e30 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
27e40 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
27e50 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
27e60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
27e70 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
27e80 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
27e90 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
27ea0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
27eb0 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
27ec0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
27ed0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27ee0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
27ef0 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
27f00 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
27f10 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
27f20 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
27f30 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
27f40 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
27f50 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
27f60 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
27f70 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
27f80 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
27f90 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
27fa0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
27fb0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
27fc0 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
27fd0 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   now..    **.   
27fe0 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
27ff0 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
28000 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
28010 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
28020 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
28030 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
28040 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
28050 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
28060 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
28070 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
28080 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
28090 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
280a0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
280b0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
280c0 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
280d0 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
280e0 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
280f0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
28100 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
28110 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28120 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
28130 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
28140 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
28150 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
28160 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
28170 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
28180 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
28190 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20  >aOverflow==0.  
281a0 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69       || nOvfl*(i
281b0 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  nt)sizeof(Pgno) 
281c0 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  > sqlite3MallocS
281d0 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ize(pCur->aOverf
281e0 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  low).      ){.  
281f0 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
28200 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
28210 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
28220 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
28230 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
28240 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
28250 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
28260 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
28270 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28280 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
28290 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
282a0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
282b0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
282c0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
282d0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
282e0 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
282f0 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
28300 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
28310 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28320 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
28330 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
28340 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
28350 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
28360 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
28370 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
28380 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79  e.      ** entry
28390 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
283a0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
283b0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
283c0 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69  skip.      ** di
283d0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
283e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
283f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
28400 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
28410 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64  ] ){.        iId
28420 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
28430 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Size);.        n
28440 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
28450 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
28460 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
28470 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
28480 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
28490 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
284a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
284b0 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68   amt>0 );.    wh
284c0 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b  ile( nextPage ){
284d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
284e0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
284f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
28500 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
28510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28520 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28530 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
28540 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61        || pCur->a
28550 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
28560 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20  nextPage.       
28570 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
28580 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43  T_DB );.      pC
28590 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
285a0 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
285b0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
285c0 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
285d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
285e0 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
285f0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
28600 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
28610 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
28620 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
28630 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
28640 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
28650 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
28660 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
28670 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
28680 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
28690 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
286a0 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
286b0 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
286c0 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
286d0 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
286e0 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
286f0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
28700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
28710 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
28720 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
28730 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
28740 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28750 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
28760 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
28770 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
28780 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
28790 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
287a0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
287b0 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
287c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
287d0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
287e0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
287f0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
28800 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
28810 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
28820 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
28830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28840 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
28850 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
28860 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
28870 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
28880 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
28890 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
288a0 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
288b0 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
288c0 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
288d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
288e0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
288f0 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
28900 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
28910 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
28920 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
28930 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66         }..#ifdef
28940 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
28950 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
28960 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74       /* If all t
28970 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
28980 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a   true:.        *
28990 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31  *.        **   1
289a0 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  ) this is a read
289b0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20   operation, and 
289c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29  .        **   2)
289d0 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65   data is require
289e0 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  d from the start
289f0 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   of this overflo
28a00 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20  w page, and.    
28a10 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72      **   3) ther
28a20 65 20 61 72 65 20 6e 6f 20 64 69 72 74 79 20 70  e are no dirty p
28a30 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
28a40 2d 63 61 63 68 65 0a 20 20 20 20 20 20 20 20 2a  -cache.        *
28a50 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61 62  *   4) the datab
28a60 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b  ase is file-back
28a70 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ed, and.        
28a80 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67 65  **   5) the page
28a90 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 57   is not in the W
28aa0 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  AL file.        
28ab0 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73 74  **   6) at least
28ac0 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c   4 bytes have al
28ad0 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20  ready been read 
28ae0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
28af0 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20  buffer .        
28b00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
28b10 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72  en data can be r
28b20 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ead directly fro
28b30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
28b40 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ile into the.   
28b50 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62       ** output b
28b60 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67  uffer, bypassing
28b70 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
28b80 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73  altogether. This
28b90 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20   speeds.        
28ba0 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61  ** up loading la
28bb0 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  rge records that
28bc0 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66   span many overf
28bd0 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20  low pages..     
28be0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28bf0 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20  ( eOp==0        
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
28c30 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65          && offse
28c40 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  t==0            
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c70 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
28c80 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
28c90 44 69 72 65 63 74 52 65 61 64 4f 6b 28 70 42 74  DirectReadOk(pBt
28ca0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
28cb0 67 65 29 20 20 20 20 2f 2a 20 28 33 2c 34 2c 35  ge)    /* (3,4,5
28cc0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
28cd0 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66   &pBuf[-4]>=pBuf
28ce0 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  Start           
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
28d10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
28d20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
28d30 2a 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  *fd = sqlite3Pag
28d40 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
28d50 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75  er);.          u
28d60 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
28d70 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
28d80 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
28d90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28da0 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72  aWrite>=pBufStar
28db0 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t );            
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28dd0 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20  due to (6) */.  
28de0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
28df0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
28e00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
28e10 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
28e20 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
28e30 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
28e40 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
28e50 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
28e60 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
28e70 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
28e80 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
28e90 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
28ea0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
28eb0 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
28ec0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
28ed0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
28ee0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28ef0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
28f00 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
28f10 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
28f20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20        (eOp==0 ? 
28f30 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
28f40 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
28f50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
28f60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28f80 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
28f90 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
28fa0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28fb0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
28fc0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
28fd0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
28fe0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
28ff0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
29000 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
29010 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
29020 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29030 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
29040 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
29050 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
29060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29070 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
29080 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69 66  -= a;.        if
29090 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  ( amt==0 ) retur
290a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 42  n rc;.        pB
290b0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
290c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
290d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49 64  break;.      iId
290e0 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  x++;.    }.  }..
290f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29100 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
29110 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20      /* Overflow 
29120 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d 61  chain ends prema
29130 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65  turely */.    re
29140 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29150 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
29160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
29180 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c  part of the payl
29190 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20  oad for the row 
291a0 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63 75  at which that cu
291b0 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75 72  rsor pCur is cur
291c0 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
291d0 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65 73  ng.  "amt" bytes
291e0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
291f0 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  rred into pBuf[]
29200 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
29210 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
29220 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  fset"..**.** pCu
29230 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e  r can be pointin
29240 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74 61  g to either a ta
29250 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  ble or an index 
29260 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f  b-tree..** If po
29270 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  inting to a tabl
29280 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74 68  e btree, then th
29290 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f  e content sectio
292a0 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a 2a  n is read.  If.*
292b0 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  * pCur is pointi
292c0 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ng to an index b
292d0 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20 6b  -tree then the k
292e0 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  ey section is re
292f0 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71  ad..**.** For sq
29300 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
29310 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  d(), the caller 
29320 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
29330 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
29340 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
29350 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65  row in the table
29360 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  .  For sqlite3Bt
29370 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  reePayloadChecke
29380 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73  d(), the.** curs
29390 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76 61  or might be inva
293a0 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65 65  lid or might nee
293b0 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  d to be restored
293c0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
293d0 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ad..**.** Return
293e0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
293f0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
29400 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
29410 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
29420 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
29430 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
29440 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
29450 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
29460 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
29470 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29480 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75  treePayload(BtCu
29490 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
294a0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
294b0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
294c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
294d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
294e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
294f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29500 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
29510 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
29520 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  =0 && pCur->pPag
29530 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
29540 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50  Cur->ix<pCur->pP
29550 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
29560 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
29570 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
29580 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
29590 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
295a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
295b0 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74  variant of sqlit
295c0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
295d0 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20 74   works even if t
295e0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
295f0 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52 53  t.** in the CURS
29600 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e 20  OR_VALID state. 
29610 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
29620 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
29630 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69  blob_read().** i
29640 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
29650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29660 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69 63  _INCRBLOB.static
29670 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
29680 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f   int accessPaylo
29690 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74 43  adChecked(.  BtC
296a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75  ursor *pCur,.  u
296b0 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33 32  32 offset,.  u32
296c0 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42   amt,.  void *pB
296d0 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  uf.){.  int rc;.
296e0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
296f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29700 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
29710 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
29720 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 75    }.  assert( cu
29730 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29740 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
29750 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
29760 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
29770 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
29780 20 72 63 20 3a 20 61 63 63 65 73 73 50 61 79 6c   rc : accessPayl
29790 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
297a0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
297b0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
297c0 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  reePayloadChecke
297d0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
297e0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
297f0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
29800 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  f){.  if( pCur->
29810 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29820 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
29830 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
29840 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
29850 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73      return acces
29860 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
29870 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
29880 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
29890 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73     return access
298a0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 70  PayloadChecked(p
298b0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
298c0 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23  , pBuf);.  }.}.#
298d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
298e0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
298f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
29900 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
29910 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
29920 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
29930 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
29940 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
29950 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
29960 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
29970 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
29980 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20  he key if index 
29990 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
299a0 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73  ntKey==0) and is
299b0 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a   the data for.**
299c0 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70   table btrees (p
299d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29  Page->intKey==1)
299e0 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  . The number of 
299f0 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
29a00 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69  le.** key/data i
29a10 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
29a20 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
29a30 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
29a40 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  ue.** returned w
29a50 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c  ill not be a val
29a60 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
29a70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
29a80 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
29a90 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
29aa0 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
29ab0 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
29ac0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
29ad0 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
29ae0 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
29af0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
29b00 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
29b10 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
29b20 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
29b30 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
29b40 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
29b50 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
29b60 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
29b70 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
29b80 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
29b90 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
29ba0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
29bb0 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
29bc0 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
29bd0 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
29be0 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
29bf0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
29c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
29c10 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
29c20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
29c30 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
29c40 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
29c50 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
29c60 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
29c70 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
29c80 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
29c90 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
29ca0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
29cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
29cc0 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79  t void *fetchPay
29cd0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
29ce0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
29cf0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
29d00 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
29d10 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a   from */.  u32 *
29d20 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20  pAmt            
29d30 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
29d40 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
29d50 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29   bytes here */.)
29d60 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61  {.  int amt;.  a
29d70 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
29d80 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
29d90 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 29   && pCur->pPage)
29da0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29db0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29dc0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
29dd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29de0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
29df0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
29e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
29e10 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29e20 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29e30 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72  t( pCur->ix<pCur
29e40 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
29e50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29e60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29  ->info.nSize>0 )
29e70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29e80 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e  ->info.pPayload>
29e90 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
29ea0 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
29eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29ec0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
29ed0 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  d<pCur->pPage->a
29ee0 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50  DataEnd ||CORRUP
29ef0 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70  T_DB);.  amt = p
29f00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
29f10 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e 74  ;.  if( amt>(int
29f20 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  )(pCur->pPage->a
29f30 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
29f40 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29  info.pPayload) )
29f50 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69  {.    /* There i
29f60 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61  s too little spa
29f70 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 66  ce on the page f
29f80 6f 72 20 74 68 65 20 65 78 70 65 63 74 65 64 20  or the expected 
29f90 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66  amount.    ** of
29fa0 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20   local content. 
29fb0 44 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  Database must be
29fc0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
29fd0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
29fe0 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d  _DB );.    amt =
29ff0 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70 43   MAX(0, (int)(pC
2a000 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61  ur->pPage->aData
2a010 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  End - pCur->info
2a020 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d  .pPayload));.  }
2a030 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32 29  .  *pAmt = (u32)
2a040 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
2a050 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
2a060 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
2a070 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
2a080 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
2a090 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
2a0a0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
2a0b0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
2a0c0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
2a0d0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
2a0e0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
2a0f0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
2a100 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
2a110 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
2a120 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
2a130 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
2a140 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
2a150 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
2a160 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
2a170 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
2a180 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
2a190 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
2a1a0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
2a1b0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
2a1c0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
2a1d0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
2a1e0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
2a1f0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
2a200 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
2a210 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
2a220 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
2a230 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
2a240 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
2a250 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
2a260 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
2a270 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
2a280 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
2a290 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
2a2a0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
2a2b0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
2a2c0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2a2d0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
2a2e0 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
2a2f0 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
2a300 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
2a310 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  mt);.}.../*.** M
2a320 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2a330 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
2a340 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
2a350 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
2a360 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
2a370 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
2a380 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
2a390 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
2a3a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2a3b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
2a3c0 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
2a3d0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
2a3e0 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
2a3f0 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
2a400 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
2a410 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
2a420 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
2a430 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
2a440 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
2a450 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
2a460 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
2a470 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
2a480 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2a490 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
2a4a0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
2a4b0 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72  wPgno){.  BtShar
2a4c0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
2a4d0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
2a4e0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2a4f0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2a500 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2a510 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2a520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a530 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
2a540 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
2a550 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a560 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
2a570 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
2a580 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
2a590 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
2a5a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2a5b0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
2a5c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2a5d0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2a5e0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2a5f0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2a600 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2a610 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a620 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 69 78  Page] = pCur->ix
2a630 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
2a640 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2a650 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
2a660 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70  Cur->ix = 0;.  p
2a670 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20  Cur->iPage++;.  
2a680 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69  return getAndIni
2a690 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
2a6a0 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  no, &pCur->pPage
2a6b0 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75  , pCur, pCur->cu
2a6c0 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a  rPagerFlags);.}.
2a6d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2a6e0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
2a6f0 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
2a700 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
2a710 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
2a720 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
2a730 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
2a740 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
2a750 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
2a760 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
2a770 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
2a780 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
2a790 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
2a7a0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2a7b0 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
2a7c0 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
2a7d0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
2a7e0 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
2a7f0 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
2a800 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
2a810 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
2a820 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
2a830 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
2a840 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
2a850 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
2a860 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
2a870 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65  he conditions te
2a880 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74  sted below might
2a890 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20   not be true.   
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8b0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61           ** in a
2a8c0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
2a8d0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
2a8e0 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
2a8f0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
2a900 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
2a910 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
2a920 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
2a930 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2a940 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
2a950 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
2a960 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2a970 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2a980 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
2a990 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
2a9a0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
2a9b0 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
2a9c0 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
2a9d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
2a9e0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
2a9f0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2aa00 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
2aa10 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
2aa20 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
2aa30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
2aa40 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
2aa50 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
2aa60 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
2aa70 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
2aa80 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
2aa90 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
2aaa0 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
2aab0 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
2aac0 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
2aad0 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
2aae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
2aaf0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
2ab00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2ab10 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a 20 20  mPage *pLeaf;.  
2ab20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2ab30 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2ab40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ab50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ab60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2ab70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2ab80 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
2ab90 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
2aba0 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
2abb0 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61  dex(.    pCur->a
2abc0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2abd0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
2abe0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2abf0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
2ac00 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20  ->pPage->pgno.  
2ac10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2ac20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2ac30 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72  >iPage-1] > pCur
2ac40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ac50 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29  Page-1]->nCell )
2ac60 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2ac70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2ac80 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2ac90 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2aca0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2acb0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 43 75    pCur->ix = pCu
2acc0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2acd0 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65 61 66  Page-1];.  pLeaf
2ace0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2acf0 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
2ad00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d 2d 70  pCur->apPage[--p
2ad10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 72  Cur->iPage];.  r
2ad20 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2ad30 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a  l(pLeaf);.}../*.
2ad40 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2ad50 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
2ad60 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2ad70 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
2ad80 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
2ad90 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
2ada0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2adb0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
2adc0 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
2add0 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
2ade0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
2adf0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
2ae00 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
2ae10 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
2ae20 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
2ae30 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
2ae40 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
2ae50 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
2ae60 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
2ae70 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
2ae80 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
2ae90 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
2aea0 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
2aeb0 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
2aec0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2aed0 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
2aee0 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
2aef0 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
2af00 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20 74 68 69  _INVALID and thi
2af10 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2af20 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20  s SQLITE_EMPTY. 
2af30 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
2af40 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20  e cursor is set 
2af50 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2af60 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74  first cell locat
2af70 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a  ed on the root.*
2af80 2a 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f  * (or virtual ro
2af90 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65  ot) page and the
2afa0 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
2afb0 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
2afc0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
2afd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2afe0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
2aff0 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
2b000 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
2b010 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
2b020 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
2b030 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
2b040 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
2b050 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
2b060 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
2b070 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
2b080 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
2b090 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
2b0a0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
2b0b0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
2b0c0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2b0d0 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2b0e0 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
2b0f0 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
2b100 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
2b110 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
2b120 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2b130 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
2b140 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
2b150 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
2b160 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
2b170 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
2b180 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
2b190 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
2b1a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2b1b0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
2b1c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b1d0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2b1e0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2b1f0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2b200 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
2b210 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
2b220 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
2b230 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
2b240 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
2b250 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2b260 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2b270 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
2b280 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2b290 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b2a0 3e 65 53 74 61 74 65 20 3c 20 43 55 52 53 4f 52  >eState < CURSOR
2b2b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 7c 7c 20  _REQUIRESEEK || 
2b2c0 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b  pCur->iPage<0 );
2b2d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b2e0 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70  >pgnoRoot>0 || p
2b2f0 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a  Cur->iPage<0 );.
2b300 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
2b310 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ge>=0 ){.    if(
2b320 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a   pCur->iPage ){.
2b330 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b340 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70  eNotNull(pCur->p
2b350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 77 68 69  Page);.      whi
2b360 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50 61 67  le( --pCur->iPag
2b370 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  e ){.        rel
2b380 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
2b390 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b3a0 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 20 20  r->iPage]);.    
2b3b0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2b3c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b3d0 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20 20 67  Page[0];.      g
2b3e0 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20  oto skip_init;. 
2b3f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2b400 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2b410 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
2b420 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2b430 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
2b440 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  urn SQLITE_EMPTY
2b450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2b460 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2b470 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  ge==(-1) );.    
2b480 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2b490 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
2b4a0 53 45 45 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  SEEK ){.      if
2b4b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b4c0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2b4d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b4e0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
2b4f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2b500 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
2b510 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
2b520 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2b530 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
2b540 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  r(pCur);.    }. 
2b550 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
2b560 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
2b570 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
2b580 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
2b590 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  >pPage,.        
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5b0 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  0, pCur->curPage
2b5c0 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  rFlags);.    if(
2b5d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b5e0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
2b5f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2b600 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
2b610 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2b620 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
2b630 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
2b640 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 70  IntKey = pCur->p
2b650 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  Page->intKey;.  
2b660 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
2b670 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2b680 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
2b690 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
2b6a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  ;..  /* If pCur-
2b6b0 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
2b6c0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
2b6d0 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
2b6e0 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
2b6f0 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
2b700 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
2b710 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
2b720 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
2b730 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c  fo is.  ** NULL,
2b740 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
2b750 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
2b760 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
2b770 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a  ot the case,.  *
2b780 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
2b790 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
2b7a0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72  . .  **.  ** Ear
2b7b0 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
2b7c0 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20   SQLite assumed 
2b7d0 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63  that this test c
2b7e0 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20  ould not fail.  
2b7f0 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70  ** if the root p
2b800 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  age was already 
2b810 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73  loaded when this
2b820 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
2b830 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20  lled (i.e..  ** 
2b840 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  if pCur->iPage>=
2b850 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20  0). But this is 
2b860 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61  not so if the da
2b870 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2b880 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63  ted .  ** in suc
2b890 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67  h a way that pag
2b8a0 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65  e pRoot is linke
2b8b0 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20  d into a second 
2b8c0 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20  b-tree table .  
2b8d0 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c  ** (or the freel
2b8e0 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ist).  */.  asse
2b8f0 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  rt( pRoot->intKe
2b900 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69  y==1 || pRoot->i
2b910 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66  ntKey==0 );.  if
2b920 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d  ( pRoot->isInit=
2b930 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65  =0 || (pCur->pKe
2b940 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74  yInfo==0)!=pRoot
2b950 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2b960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2b970 52 52 55 50 54 5f 50 41 47 45 28 70 43 75 72 2d  RRUPT_PAGE(pCur-
2b980 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b  >pPage);.  }..sk
2b990 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75  ip_init:  .  pCu
2b9a0 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75  r->ix = 0;.  pCu
2b9b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2b9c0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2b9d0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2b9e0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
2b9f0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2ba00 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  fl);..  pRoot = 
2ba10 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
2ba20 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
2ba30 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
2ba40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2ba50 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
2ba60 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
2ba70 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
2ba80 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
2ba90 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
2baa0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2bab0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
2bac0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
2bad0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
2bae0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
2baf0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
2bb00 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2bb10 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
2bb20 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2bb30 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
2bb40 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
2bb50 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2bb60 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 53  ALID;.    rc = S
2bb70 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2bb80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bb90 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2bba0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2bbb0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2bbc0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2bbd0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
2bbe0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2bbf0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
2bc00 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
2bc10 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
2bc20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
2bc30 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
2bc40 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
2bc50 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
2bc60 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2bc70 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
2bc80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
2bc90 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
2bca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2bcb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2bcc0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2bcd0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2bce0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2bcf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2bd00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2bd10 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2bd20 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
2bd30 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
2bd40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
2bd50 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50  ert( pCur->ix<pP
2bd60 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2bd70 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2bd80 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2bd90 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20  , pCur->ix));.  
2bda0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2bdb0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
2bdc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bdd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2bde0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2bdf0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
2be00 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
2be10 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
2be20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2be30 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2be40 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
2be50 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
2be60 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
2be70 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
2be80 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
2be90 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
2bea0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
2beb0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
2bec0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
2bed0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
2bee0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
2bef0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
2bf00 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
2bf10 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
2bf20 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
2bf30 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
2bf40 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
2bf50 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
2bf60 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
2bf70 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
2bf80 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2bf90 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
2bfa0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
2bfb0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
2bfc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bfd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2bfe0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
2bff0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2c000 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2c010 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2c020 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2c030 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
2c040 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2c050 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
2c060 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2c070 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2c080 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2c090 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  8]);.    pCur->i
2c0a0 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
2c0b0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2c0c0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
2c0d0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
2c0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c0f0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2c100 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
2c110 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2c120 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2c130 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2c140 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2c150 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
2c160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c170 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
2c180 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2c190 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2c1a0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2c1b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2c1c0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2c1d0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2c1e0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2c1f0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2c200 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2c210 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2c220 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2c230 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2c240 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
2c250 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c260 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2c270 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2c280 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2c290 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c2a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c2b0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2c2c0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2c2d0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
2c2e0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2c2f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c300 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2c310 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c320 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  >0 );.    *pRes 
2c330 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
2c340 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2c350 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
2c360 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59  rc==SQLITE_EMPTY
2c370 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c380 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2c390 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65  0 || pCur->pPage
2c3a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2c3b0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2c3c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c3d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2c3f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2c400 2d 6f 70 20 69 66 20 63 75 72 73 6f 72 20 70 43  -op if cursor pC
2c410 75 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e  ur does not poin
2c420 74 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  t to a valid row
2c430 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
2c440 69 66 20 70 43 75 72 20 69 73 20 76 61 6c 69 64  if pCur is valid
2c450 2c 20 63 6f 6e 66 69 67 75 72 65 20 69 74 20 73  , configure it s
2c460 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
2c470 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
2c480 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 69 73  e3BtreeNext() is
2c490 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66   a no-op..*/.#if
2c4a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c4b0 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 76 6f 69 64  _WINDOWFUNC.void
2c4c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 6b 69   sqlite3BtreeSki
2c4d0 70 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  pNext(BtCursor *
2c4e0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 57 65 20 62  pCur){.  /* We b
2c4f0 65 6c 69 65 76 65 20 74 68 61 74 20 74 68 65 20  elieve that the 
2c500 63 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 77 61  cursor must alwa
2c510 79 73 20 62 65 20 69 6e 20 74 68 65 20 76 61 6c  ys be in the val
2c520 69 64 20 73 74 61 74 65 20 77 68 65 6e 0a 20 20  id state when.  
2c530 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2c540 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 74  is called, but t
2c550 68 65 20 70 72 6f 6f 66 20 69 73 20 64 69 66 66  he proof is diff
2c560 69 63 75 6c 74 2c 20 73 6f 20 77 65 20 61 64 64  icult, so we add
2c570 20 61 6e 0a 20 20 2a 2a 20 41 4c 57 61 59 53 28   an.  ** ALWaYS(
2c580 29 20 74 65 73 74 20 6a 75 73 74 20 69 6e 20 63  ) test just in c
2c590 61 73 65 20 77 65 20 61 72 65 20 77 72 6f 6e 67  ase we are wrong
2c5a0 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59  . */.  if( ALWAY
2c5b0 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  S(pCur->eState==
2c5c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b  CURSOR_VALID) ){
2c5d0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2c5e0 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
2c5f0 45 58 54 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73  EXT;.    pCur->s
2c600 6b 69 70 4e 65 78 74 20 3d 20 31 3b 0a 20 20 7d  kipNext = 1;.  }
2c610 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2c620 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
2c630 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65 20  UNC */../* Move 
2c640 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2c650 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2c660 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2c670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2c680 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2c690 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2c6a0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2c6b0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2c6c0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2c6d0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2c6e0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2c6f0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2c700 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
2c710 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2c720 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2c730 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
2c740 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2c750 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c760 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c770 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2c780 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2c790 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2c7a0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
2c7b0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
2c7c0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
2c7d0 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
2c7e0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
2c7f0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
2c800 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2c810 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2c820 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
2c830 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
2c840 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
2c850 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
2c860 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
2c870 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
2c880 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
2c890 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2c8a0 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
2c8b0 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
2c8c0 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
2c8d0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
2c8e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c8f0 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
2c900 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
2c910 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
2c920 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c930 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  x==pCur->pPage->
2c940 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
2c950 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2c960 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  ge->leaf );.#end
2c970 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
2c980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2c990 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2c9a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2c9b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c9c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c9d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c9e0 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65  ALID );.    *pRe
2c9f0 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
2ca00 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2ca10 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2ca20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ca30 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2ca40 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2ca50 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ast;.    }else{.
2ca60 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2ca70 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
2ca80 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Last;.    }.  }e
2ca90 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2caa0 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2cab0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2cac0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2cad0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2cae0 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
2caf0 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
2cb00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
2cb10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2cb20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2cb30 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2cb40 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2cb50 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2cb60 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2cb70 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2cb80 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2cb90 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2cba0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2cbb0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2cbc0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2cbd0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2cbe0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2cbf0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2cc00 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2cc10 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2cc20 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2cc30 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2cc40 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2cc50 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2cc60 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2cc70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2cc80 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2cc90 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2cca0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2ccb0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2ccc0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2ccd0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2cce0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2ccf0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2cd00 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2cd10 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2cd20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2cd30 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2cd40 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2cd50 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2cd60 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2cd70 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2cd80 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2cd90 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2cda0 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2cdb0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2cdc0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2cdd0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2cde0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2cdf0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2ce00 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2ce10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2ce20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2ce30 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2ce40 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2ce50 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2ce80 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2ce90 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2cea0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2ceb0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2cec0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2ced0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2cee0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2cef0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2cf00 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2cf10 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2cf20 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2cf30 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2cf40 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2cf50 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2cf60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2cf70 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2cf80 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2cf90 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2cfa0 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2cfb0 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2cfc0 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2cfd0 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2cfe0 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2cff0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2d000 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2d010 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2d020 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2d030 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2d040 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2d050 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2d060 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2d070 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2d080 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2d090 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2d0a0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2d0b0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2d0c0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2d0d0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2d0e0 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2d0f0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2d100 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2d110 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2d120 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2d130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2d140 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2d150 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2d160 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2d170 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2d180 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2d190 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2d1a0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2d1b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d1c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2d1d0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2d1e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2d1f0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2d200 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2d210 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2d220 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2d230 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2d240 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2d250 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2d260 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2d270 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2d280 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2d290 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2d2a0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2d2b0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2d2c0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2d2d0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2d2e0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2d2f0 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2d300 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2d310 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d320 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2d330 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2d340 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2d350 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2d360 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2d370 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2d380 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2d390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d3a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2d3b0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2d3c0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2d3d0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2d3e0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2d3f0 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ast)!=0 ){.     
2d400 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2d410 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2d430 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2d440 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69   requested key i
2d450 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2d460 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79  the previous key
2d470 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2d480 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65  try to get there
2d490 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74   using sqlite3Bt
2d4a0 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72  reeNext() rather
2d4b0 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20   than a full.   
2d4c0 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61     ** binary sea
2d4d0 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rch.  This is an
2d4e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
2d4f0 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74  ly.  The correct
2d500 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a   answer.      **
2d510 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e   is still obtain
2d520 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ed without this 
2d530 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74  case, only a lit
2d540 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79  tle more slowely
2d550 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2d560 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d  ur->info.nKey+1=
2d570 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2d580 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2d590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d5a0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2d5b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2d5c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  ){.          get
2d5e0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
2d5f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2d600 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2d610 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d620 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d630 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d640 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2d650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d660 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
2d670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d680 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2d690 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d6a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d6c0 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
2d6d0 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
2d6e0 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
2d6f0 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
2d700 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
2d710 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
2d720 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2d730 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2d740 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
2d750 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2d760 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
2d770 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2d780 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
2d790 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2d7a0 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2d7b0 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
2d7c0 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
2d7d0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
2d7e0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2d7f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2d800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d810 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20  _EMPTY ){.      
2d820 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2d830 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2d840 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2d850 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
2d860 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
2d870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d880 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2d890 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2d8a0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
2d8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d8c0 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
2d8d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d8e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d8f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2d900 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2d910 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20  ->nCell > 0 );. 
2d920 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2d930 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Page==0 || pCur-
2d940 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2d950 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
2d960 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2d970 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2d980 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
2d990 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
2d9a0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
2d9b0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
2d9c0 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
2d9d0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2d9e0 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70  pPage;.    u8 *p
2d9f0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2da10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
2da20 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
2da30 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
2da40 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
2da50 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2da60 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
2da70 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
2da80 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
2da90 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
2daa0 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
2dab0 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
2dac0 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
2dad0 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
2dae0 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
2daf0 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
2db00 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
2db10 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
2db20 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
2db30 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
2db40 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
2db50 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
2db60 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
2db70 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
2db80 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
2db90 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
2dba0 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
2dbb0 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
2dbc0 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
2dbd0 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
2dbe0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2dbf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2dc00 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2dc10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2dc20 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
2dc30 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
2dc40 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
2dc50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2dc60 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
2dc70 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
2dc80 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
2dc90 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
2dca0 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
2dcb0 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
2dcc0 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
2dcd0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20  */.    pCur->ix 
2dce0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2dcf0 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
2dd00 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
2dd10 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2dd20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
2dd30 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2dd40 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2dd50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  age, idx);.     
2dd60 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2dd70 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
2dd80 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
2dd90 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
2dda0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2ddb0 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
2ddc0 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20  >aDataEnd ){.   
2ddd0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2dde0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2ddf0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
2de00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2de20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
2de30 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
2de40 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
2de50 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
2de60 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2de70 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2de80 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2de90 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2dea0 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
2deb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
2dec0 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
2ded0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2dee0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2def0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2df00 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
2df10 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2df20 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2df30 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
2df40 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
2df50 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2df60 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2df70 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2df80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2df90 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
2dfa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2dfb0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a  eto_next_layer;.
2dfc0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2dfd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2dfe0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2dff0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
2e000 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2e010 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2e020 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2e030 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2e040 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
2e050 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2e060 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2e070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e090 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2e0a0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2e0b0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2e0c0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2e0d0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2e0e0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
2e0f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e100 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2e110 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
2e120 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
2e130 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
2e140 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
2e150 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2e160 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2e170 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
2e180 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
2e190 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
2e1a0 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
2e1b0 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
2e1c0 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
2e1d0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
2e1e0 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
2e1f0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
2e200 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
2e210 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
2e220 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
2e230 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
2e240 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
2e250 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
2e260 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2e270 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
2e280 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
2e290 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
2e2a0 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
2e2b0 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
2e2c0 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
2e2d0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
2e2e0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
2e2f0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
2e300 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
2e310 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
2e320 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
2e330 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
2e340 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
2e350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
2e360 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
2e370 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2e380 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
2e390 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
2e3a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2e3b0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
2e3c0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2e3d0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
2e3e0 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
2e3f0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
2e400 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2e410 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
2e420 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
2e430 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
2e440 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2e450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2e460 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
2e470 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2e480 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2e490 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2e4a0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2e4b0 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
2e4c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2e4d0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
2e4e0 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
2e4f0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
2e500 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
2e510 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
2e520 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
2e530 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2e540 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
2e550 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
2e560 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2e570 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
2e580 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
2e590 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2e5a0 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
2e5b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2e5c0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2e5d0 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
2e5e0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2e5f0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2e600 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2e610 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
2e620 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2e630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e640 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2e650 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
2e660 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
2e670 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
2e680 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
2e690 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
2e6a0 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
2e6b0 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
2e6c0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
2e6d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
2e6e0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
2e6f0 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
2e700 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
2e710 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
2e720 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
2e730 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
2e740 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
2e750 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
2e760 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2e770 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
2e780 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f  rrupt, the xReco
2e790 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e  rdCompare routin
2e7a0 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20  e may read.     
2e7b0 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77       ** up to tw
2e7c0 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74  o varints past t
2e7d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2e7e0 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31  ffer. An extra 1
2e7f0 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  8 .          ** 
2e800 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
2e810 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74   is allocated at
2e820 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2e830 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20  buffer in.      
2e840 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
2e850 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20   happens.  */.  
2e860 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
2e870 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2e880 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
2e890 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
2e8a0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
2e8b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2e8c0 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
2e8d0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  l(pPage, pCellBo
2e8e0 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
2e8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
2e900 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
2e910 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
2e920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2e930 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72  ell<0 );   /* Tr
2e940 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69  ue if key size i
2e950 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a  s 2^32 or more *
2e960 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2e970 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29  case( nCell==0 )
2e980 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2e990 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2e9a0 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20  80 0x00 */.     
2e9b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2e9c0 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49  Cell==1 );  /* I
2e9d0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2e9e0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31    0x80 0x80 0x01
2e9f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2ea00 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32  stcase( nCell==2
2ea10 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
2ea20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20  legal index key 
2ea30 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  size */.        
2ea40 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 7c 7c    if( nCell<2 ||
2ea50 20 6e 43 65 6c 6c 2f 70 43 75 72 2d 3e 70 42 74   nCell/pCur->pBt
2ea60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 70 43 75  ->usableSize>pCu
2ea70 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29 7b  r->pBt->nPage ){
2ea80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2ea90 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2eaa0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
2eab0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2eac0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2ead0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2eae0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
2eaf0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
2eb00 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20  ell+18 );.      
2eb10 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
2eb20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2eb30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2eb40 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2eb50 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2eb60 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2eb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2eb80 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2eb90 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2eba0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
2ebb0 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
2ebc0 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
2ebd0 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b  r*)pCellKey, 0);
2ebe0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2ebf0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2ec00 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
2ec10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2ec20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2ec30 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2ec40 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2ec50 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2ec60 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2ec70 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
2ec80 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2ec90 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2eca0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2ecb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ecc0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2ecd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2ece0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2ecf0 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2ed00 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2ed10 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2ed20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2ed30 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2ed40 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2ed50 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2ed60 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2ed70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2ed80 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2ed90 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2eda0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2edb0 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2edc0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2edd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2ede0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2edf0 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2ee00 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2ee10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2ee20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ee30 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2ee40 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2ee50 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2ee60 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2ee70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ee80 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2ee90 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2eea0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2eeb0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2eec0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2eed0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2eee0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2eef0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2ef00 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2ef10 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
2ef20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
2ef30 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
2ef40 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
2ef50 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2ef60 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
2ef70 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2ef80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2ef90 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2efa0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2efb0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
2efc0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
2efd0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2efe0 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
2eff0 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
2f000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f010 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2f020 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
2f030 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
2f040 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
2f050 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2f060 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2f070 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2f080 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f090 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
2f0a0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2f0b0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2f0c0 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
2f0d0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2f0e0 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  ix = (u16)lwr;. 
2f0f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2f100 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
2f110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f120 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
2f130 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
2f140 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2f150 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2f160 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2f170 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2f180 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
2f190 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2f1a0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2f1b0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2f1c0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2f1d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2f1e0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2f1f0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2f200 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2f210 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2f220 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2f230 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2f240 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2f250 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2f260 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2f270 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2f280 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2f290 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2f2a0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2f2b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2f2c0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2f2d0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2f2e0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2f2f0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2f300 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2f310 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2f320 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2f330 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2f340 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2f350 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2f360 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2f370 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2f380 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2f390 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2f3a0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2f3b0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2f3c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2f3d0 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66  rn an estimate f
2f3e0 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
2f3f0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2f400 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  le that pCur is.
2f410 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ** pointing to. 
2f420 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
2f430 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20  ve number if no 
2f440 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72  estimate is curr
2f450 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61  ently .** availa
2f460 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ble..*/.i64 sqli
2f470 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74  te3BtreeRowCount
2f480 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Est(BtCursor *pC
2f490 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  ur){.  i64 n;.  
2f4a0 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  u8 i;..  assert(
2f4b0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2f4c0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2f4d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f4e0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2f4f0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2f500 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72  x) );..  /* Curr
2f510 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72  ently this inter
2f520 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  face is only cal
2f530 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66  led by the OP_If
2f540 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63  Smaller.  ** opc
2f550 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74  ode, and it that
2f560 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72   case the cursor
2f570 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2f580 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77  valid and.  ** w
2f590 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74  ill always point
2f5a0 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e   to a leaf node.
2f5b0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2f5c0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2f5d0 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65  RSOR_VALID) ) re
2f5e0 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e  turn -1;.  if( N
2f5f0 45 56 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65  EVER(pCur->pPage
2f600 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74  ->leaf==0) ) ret
2f610 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70  urn -1;..  n = p
2f620 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2f630 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
2f640 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
2f650 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72  ){.    n *= pCur
2f660 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65  ->apPage[i]->nCe
2f670 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ll;.  }.  return
2f680 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   n;.}../*.** Adv
2f690 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2f6a0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2f6b0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2f6c0 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  e. .** Return va
2f6d0 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51  lue:.**.**    SQ
2f6e0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73  LITE_OK        s
2f6f0 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c  uccess.**    SQL
2f700 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75  ITE_DONE      cu
2f710 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2f720 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
2f730 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  last element.** 
2f740 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2f750 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
2f760 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
2f770 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2f780 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2f790 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2f7a0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2f7b0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2f7c0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2f7d0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2f7e0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2f7f0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2f800 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2f810 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2f820 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2f830 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2f840 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2f850 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2f860 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2f870 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2f880 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2f890 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2f8a0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2f8b0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
2f8c0 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
2f8d0 20 46 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73   F argument in s
2f8e0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2f8f0 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20  C,F) is 1, then 
2f900 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f  the.** cursor co
2f910 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2f920 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
2f930 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
2f940 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
2f950 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
2f960 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
2f970 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2f980 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a   The F argument.
2f990 2a 2a 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  ** is a hint to 
2f9a0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
2f9b0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2f9c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2f9d0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73   not use.** this
2f9e0 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42   hint, but COMDB
2f9f0 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  2 does..*/.stati
2fa00 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2fa10 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2fa20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2fa30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2fa40 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2fa50 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2fa60 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2fa70 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2fa80 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2fa90 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2faa0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
2fab0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2fac0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2fad0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2fae0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2faf0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2fb00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fb10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2fb20 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2fb30 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2fb40 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2fb50 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2fb60 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2fb70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2fb80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2fb90 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
2fba0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2fbb0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2fbc0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2fbd0 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 20 72 65  >skipNext>0 ) re
2fbe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fbf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2fc00 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2fc10 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
2fc20 2d 3e 69 78 3b 0a 20 20 69 66 28 20 21 70 50 61  ->ix;.  if( !pPa
2fc30 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
2fc40 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 6b 6e    /* The only kn
2fc50 6f 77 6e 20 77 61 79 20 66 6f 72 20 74 68 69 73  own way for this
2fc60 20 74 6f 20 68 61 70 70 65 6e 20 69 73 20 66 6f   to happen is fo
2fc70 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 0a  r there to be a.
2fc80 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
2fc90 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
2fca0 61 74 20 64 6f 65 73 20 61 20 44 45 4c 45 54 45  at does a DELETE
2fcb0 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 70 61   operation as pa
2fcc0 72 74 20 6f 66 20 61 0a 20 20 20 20 2a 2a 20 53  rt of a.    ** S
2fcd0 45 4c 45 43 54 20 77 68 69 63 68 20 64 65 6c 65  ELECT which dele
2fce0 74 65 73 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  tes content out 
2fcf0 66 72 6f 6d 20 75 6e 64 65 72 20 61 6e 20 61 63  from under an ac
2fd00 74 69 76 65 20 63 75 72 73 6f 72 0a 20 20 20 20  tive cursor.    
2fd10 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
2fd20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
2fd30 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 62 65  ere the table be
2fd40 69 6e 67 20 44 45 4c 45 54 45 2d 65 64 20 66 72  ing DELETE-ed fr
2fd50 6f 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 70 61  om.    ** has pa
2fd60 67 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  ges in common wi
2fd70 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
2fd80 6e 67 20 71 75 65 72 69 65 64 2e 20 20 53 65 65  ng queried.  See
2fd90 20 54 48 33 0a 20 20 20 20 2a 2a 20 6d 6f 64 75   TH3.    ** modu
2fda0 6c 65 20 63 6f 76 31 2f 62 74 72 65 65 37 38 2e  le cov1/btree78.
2fdb0 74 65 73 74 20 74 65 73 74 63 61 73 65 20 32 32  test testcase 22
2fdc0 30 20 28 32 30 31 38 2d 30 36 2d 30 38 29 20 66  0 (2018-06-08) f
2fdd0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 61  or an.    ** exa
2fde0 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74  mple. */.    ret
2fdf0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2fe00 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
2fe10 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2fe20 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2fe30 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2fe40 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2fe50 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2fe60 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2fe70 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2fe80 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2fe90 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2fea0 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2feb0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2fec0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2fed0 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2fee0 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2fef0 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2ff00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2ff10 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2ff20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2ff30 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2ff40 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2ff50 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2ff60 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2ff70 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2ff80 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2ff90 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2ffa0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2ffb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2ffc0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2ffd0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2ffe0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2fff0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
30000 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
30010 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30020 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
30030 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
30040 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
30050 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
30060 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
30070 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
30080 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
30090 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
300a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
300b0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
300c0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
300d0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
300e0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
300f0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e  while( pCur->ix>
30100 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
30110 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
30120 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
30130 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
30140 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29  reeNext(pCur, 0)
30150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30170 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
30180 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
30190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
301a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
301b0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
301c0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
301d0 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
301e0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
301f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30200 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d  nt flags){.  Mem
30210 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55  Page *pPage;.  U
30220 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30230 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
30240 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
30250 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
30260 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
30270 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
30280 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
30290 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
302a0 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20  | flags==1 );.  
302b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
302c0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
302d0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
302e0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
302f0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
30300 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
30310 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
30320 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
30330 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
30340 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
30350 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29  if( (++pCur->ix)
30360 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
30370 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  {.    pCur->ix--
30380 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
30390 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
303a0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
303b0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
303c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
303d0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
303e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
303f0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
30400 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
30410 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
30420 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
30430 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
30440 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  abase..** Return
30450 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
30460 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
30470 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20   success.**     
30480 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68  SQLITE_DONE   th
30490 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
304a0 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ady on the first
304b0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
304c0 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68  table.**     oth
304d0 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20  erwise     some 
304e0 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63  kind of error oc
304f0 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65  curred.**.** The
30500 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
30510 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
30520 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
30530 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
30540 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
30550 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
30560 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
30570 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
30580 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
30590 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
305a0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
305b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
305c0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
305d0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
305e0 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
305f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
30600 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
30610 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
30620 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
30630 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
30640 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
30650 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
30660 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74  the F argument t
30670 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  o sqlite3BtreePr
30680 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31  evious(C,F) is 1
30690 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
306a0 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  rsor corresponds
306b0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
306c0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
306d0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
306e0 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20  n.** skipped if 
306f0 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61  the SQL index ha
30700 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20  d been a unique 
30710 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72  index.  The F ar
30720 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68  gument is a.** h
30730 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
30740 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76  ment.  The nativ
30750 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  e SQLite btree i
30760 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
30770 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68  es not.** use th
30780 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d  is hint, but COM
30790 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61  DB2 does..*/.sta
307a0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
307b0 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
307c0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
307d0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
307e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
307f0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
30800 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
30810 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
30820 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30830 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
30840 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
30850 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
30860 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
30870 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
30880 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
30890 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
308a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
308b0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
308c0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
308d0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
308e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
308f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30900 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
30910 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
30920 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
30930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30940 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
30950 69 66 28 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  if( CURSOR_SKIPN
30960 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  EXT==pCur->eStat
30970 65 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  e ){.      pCur-
30980 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
30990 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
309a0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
309b0 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
309c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
309d0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
309e0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
309f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
30a00 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
30a10 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
30a20 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78  t idx = pCur->ix
30a30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
30a40 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
30a50 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
30a60 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
30a70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30a80 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
30a90 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
30aa0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
30ab0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
30ac0 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ix==0 ){.      i
30ad0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
30ae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
30af0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
30b00 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
30b10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30b20 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
30b30 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
30b40 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
30b50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
30b60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
30b70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
30b80 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30b90 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   (BTCF_ValidOvfl
30ba0 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
30bb0 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50  ur->ix--;.    pP
30bc0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
30bd0 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
30be0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
30bf0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30c10 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
30c20 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
30c30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30c40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
30c50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30c60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
30c70 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
30c80 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
30c90 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  gs){.  assert( c
30ca0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
30cb0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
30cc0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
30cd0 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 55   flags==1 );.  U
30ce0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30cf0 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
30d00 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
30d10 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
30d20 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
30d30 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
30d40 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
30d50 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
30d60 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
30d70 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
30d80 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
30d90 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
30da0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
30db0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70  =0.   || pCur->p
30dc0 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  Page->leaf==0.  
30dd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
30de0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
30df0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  );.  }.  pCur->i
30e00 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x--;.  return SQ
30e10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
30e20 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
30e30 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
30e40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30e50 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
30e60 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
30e70 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
30e80 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
30e90 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
30ea0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
30eb0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
30ec0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
30ed0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
30ee0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
30ef0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
30f00 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
30f10 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
30f20 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
30f30 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
30f40 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
30f50 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
30f60 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
30f70 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
30f80 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
30f90 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
30fa0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
30fb0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
30fc0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
30fd0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
30fe0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
30ff0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
31000 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
31010 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
31020 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
31030 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
31040 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
31050 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
31060 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
31070 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
31080 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
31090 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
310a0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
310b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
310c0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
310d0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
310e0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
310f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
31100 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
31110 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
31120 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
31130 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
31140 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
31150 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
31160 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
31170 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
31180 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
31190 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
311a0 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
311b0 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
311c0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
311d0 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
311e0 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
311f0 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
31200 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
31210 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
31220 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
31230 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
31240 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
31250 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
31260 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
31270 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
31280 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
31290 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
312a0 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
312b0 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
312c0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
312d0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
312e0 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
312f0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
31300 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
31310 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
31320 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
31330 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
31340 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
31350 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
31360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31370 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
31380 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
31390 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
313a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
313b0 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
313c0 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
313d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
313e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
313f0 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
31400 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
31410 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
31420 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
31430 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
31440 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
31450 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
31460 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
31470 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
31480 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
31490 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
314a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
314b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
314c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
314d0 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
314e0 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
314f0 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74  y>0 && IfNotOmit
31500 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  AV(pBt->autoVacu
31510 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31  um)) );.  pPage1
31520 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
31530 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
31540 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
31550 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
31560 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20  : R-05119-02637 
31570 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
31580 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
31590 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20   offset 36.  ** 
315a0 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68  stores stores th
315b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
315c0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
315d0 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20  reelist. */.  n 
315e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
315f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
31600 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
31610 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
31620 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
31630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31640 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31650 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
31660 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
31670 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
31680 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
31690 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
316a0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
316b0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
316c0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
316d0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
316e0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
316f0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
31700 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63  /.    u32 nSearc
31710 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e  h = 0;   /* Coun
31720 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
31730 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70  of search attemp
31740 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  ts */.    .    /
31750 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  * If eMode==BTAL
31760 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20  LOC_EXACT and a 
31770 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
31780 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
31790 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
317a0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
317b0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
317c0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
317d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
317e0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
317f0 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
31800 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
31810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31820 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31830 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
31840 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
31850 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d      if( nearby<=
31860 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
31870 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
31880 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
31890 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
318a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
318b0 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
318c0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
318d0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
318e0 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
318f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
31900 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
31910 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
31920 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
31930 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
31940 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
31950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
31960 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54  se if( eMode==BT
31970 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
31980 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
31990 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
319a0 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
319b0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
319c0 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
319d0 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
319e0 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
319f0 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
31a00 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
31a10 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
31a20 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
31a30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31a40 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
31a50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31a60 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31a70 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
31a80 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31a90 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
31aa0 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
31ab0 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
31ac0 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
31ad0 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
31ae0 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
31af0 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
31b00 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
31b10 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
31b20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
31b30 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
31b40 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
31b50 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
31b60 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
31b70 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
31b80 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
31b90 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
31ba0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
31bb0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
31bc0 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
31bd0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
31be0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
31bf0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
31c00 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
31c10 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
31c20 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54   R-01506-11053 T
31c30 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
31c40 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
31c50 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
31c60 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65    ** is the page
31c70 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
31c80 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ext freelist tru
31c90 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  nk page in the l
31ca0 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ist or.        *
31cb0 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69  * zero if this i
31cc0 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c  s the last freel
31cd0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
31ce0 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
31cf0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
31d00 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
31d10 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
31d20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
31d30 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34  DENCE-OF: R-5984
31d40 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79  1-13798 The 4-by
31d50 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
31d60 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
31d70 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  32.        ** st
31d80 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75  ores the page nu
31d90 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
31da0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72  t page of the fr
31db0 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20  eelist, or zero 
31dc0 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
31dd0 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
31de0 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  pty. */.        
31df0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
31e00 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
31e10 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
31e20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
31e30 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
31e40 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
31e50 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61  k>mxPage || nSea
31e60 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20  rch++ > n ){.   
31e70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31e80 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
31e90 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76  revTrunk ? pPrev
31ea0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29  Trunk->pgno : 1)
31eb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31ec0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
31ed0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
31ee0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
31ef0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
31f00 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
31f10 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
31f20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
31f30 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31f40 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
31f50 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
31f60 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
31f70 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
31f80 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
31f90 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
31fa0 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
31fb0 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
31fc0 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
31fd0 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
31fe0 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
31ff0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
32000 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
32010 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
32020 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
32030 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
32040 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
32050 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
32060 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
32070 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
32080 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
32090 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
320a0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
320b0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
320c0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
320d0 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
320e0 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
320f0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
32100 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
32110 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
32120 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
32130 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32140 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
32150 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32160 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32170 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32180 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
321a0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
321b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
321c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
321d0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
321e0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
321f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
32200 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
32210 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
32220 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32230 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
32240 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
32250 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
32260 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
32270 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
32280 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
32290 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
322a0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
322b0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
322c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
322d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
322e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
322f0 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
32300 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32310 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
32320 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32330 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
32350 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
32360 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
32370 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
32380 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
32390 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
323a0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
323b0 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
323c0 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
323d0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
323e0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
323f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
32400 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
32410 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
32420 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
32430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32440 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
32450 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
32460 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
32470 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
32480 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
32490 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
324a0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
324b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
324c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
324d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
324e0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
324f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
32500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
32510 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
32520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32530 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
32540 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
32550 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
32560 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
32570 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
32580 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32590 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
325a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
325b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
325c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
325d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
325e0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
325f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
32600 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
32610 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
32620 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
32630 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
32640 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
32670 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
32680 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
32690 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
326a0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
326b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
326c0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
326d0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
326e0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
326f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
32700 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
32710 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32720 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
32730 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
32740 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
32750 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
32760 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
32770 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
32780 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
32790 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
327a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
327b0 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
327c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
327d0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
327e0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
327f0 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
32800 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
32810 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32820 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
32830 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
32840 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
32850 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
32860 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32880 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32890 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
328a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
328b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
328c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
328d0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
328e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
328f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32900 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
32910 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
32920 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
32930 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32940 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
32960 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
32970 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
32980 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
32990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
329a0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
329b0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
329c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
329d0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
329e0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
329f0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
32a00 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
32a10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
32a20 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
32a30 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
32a40 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
32a50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32a60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32a70 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
32a80 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
32a90 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
32aa0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
32ab0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
32ac0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32ae0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32af0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
32b00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
32b10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32b20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32b30 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
32b50 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
32b60 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
32b70 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
32b80 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
32b90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32ba0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
32bb0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
32bc0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
32bd0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
32be0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
32bf0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
32c00 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
32c10 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
32c20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
32c30 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
32c40 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
32c50 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
32c60 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
32c70 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
32c80 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
32c90 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
32ca0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
32cb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
32cc0 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
32cd0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
32ce0 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
32cf0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
32d00 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
32d10 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
32d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
32d30 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
32d40 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
32d50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
32d60 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
32d70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32d80 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
32d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
32da0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
32db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32dc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
32dd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
32de0 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
32df0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
32e00 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
32e10 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
32e20 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
32e30 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
32e40 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
32e50 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
32e60 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
32e70 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
32e80 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
32e90 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
32ea0 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
32eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32ec0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
32ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32ee0 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
32ef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
32f20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
32f30 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
32f40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
32f50 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
32f60 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
32f70 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
32f80 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
32f90 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
32fa0 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
32fb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
32fc0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
32fd0 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
32fe0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
32ff0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
33000 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
33010 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
33020 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
33030 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
33040 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
33050 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
33060 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
33070 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
33080 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
33090 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
330a0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
330b0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
330c0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
330d0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
330e0 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
330f0 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
33100 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
33110 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
33120 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
33130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
33140 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
33150 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
33160 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
33170 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
33180 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33190 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
331a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
331b0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
331c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
331d0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
331e0 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
331f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
33200 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
33210 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
33220 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
33230 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
33240 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
33250 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
33260 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
33270 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
33280 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
33290 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
332a0 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
332b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
332c0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
332d0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
332e0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
332f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33310 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33320 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
33330 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
33340 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
33350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33370 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
33380 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
33390 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
333a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
333b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
333c0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
333d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
333e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
333f0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
33400 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
33410 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
33420 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
33430 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
33440 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
33450 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
33460 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
33470 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
33480 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
33490 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
334a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
334b0 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
334c0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
334d0 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
334e0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
334f0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
33500 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
33510 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
33520 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
33530 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
33540 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
33550 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
33560 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
33570 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
33580 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
33590 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
335a0 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
335b0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
335c0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
335d0 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
335e0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
335f0 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
33600 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
33610 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
33620 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
33630 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
33640 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
33650 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
33660 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
33670 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
33680 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
33690 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
336a0 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
336b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
336c0 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
336d0 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
336e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
336f0 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
33700 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
33710 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
33720 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
33730 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
33740 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
33750 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
33760 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
33770 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
33780 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
33790 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
337a0 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
337b0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
337c0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
337d0 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
337e0 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
337f0 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
33800 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
33810 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
33820 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
33830 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
33840 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
33850 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
33860 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
33870 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
33880 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
33890 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
338a0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
338b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
338c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
338d0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
338e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
338f0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
33900 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
33910 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
33920 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
33930 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
33940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33950 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
33960 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
33970 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
33980 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
33990 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
339a0 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
339b0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
339c0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
339d0 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
339e0 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
339f0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
33a00 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
33a10 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
33a20 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
33a30 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
33a40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
33a50 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
33a60 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
33a70 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
33a80 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
33a90 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
33aa0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
33ab0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
33ac0 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
33ad0 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
33ae0 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
33af0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
33b00 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33b10 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
33b20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
33b30 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
33b40 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
33b50 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
33b60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
33b80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33b90 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
33ba0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
33bb0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
33bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33bd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33be0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
33bf0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
33c00 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
33c10 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33c20 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
33c30 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
33c40 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
33c50 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
33c60 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
33c70 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
33c80 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
33c90 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
33ca0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
33cb0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
33cc0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
33cd0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
33ce0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
33cf0 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
33d00 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33d10 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
33d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33d30 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
33d40 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
33d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33d60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
33d70 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
33d80 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
33d90 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
33da0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
33db0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
33dc0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
33dd0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  }..  assert( COR
33de0 52 55 50 54 5f 44 42 20 7c 7c 20 2a 70 50 67 6e  RUPT_DB || *pPgn
33df0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
33e00 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
33e10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
33e20 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
33e30 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
33e40 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
33e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
33e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
33e70 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
33e80 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
33e90 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b  ->pDbPage)<=1 );
33ea0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
33eb0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70  QLITE_OK || (*pp
33ec0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
33ed0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
33ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
33ef0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
33f00 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
33f10 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
33f20 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
33f30 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
33f40 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
33f50 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33f60 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
33f70 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
33f80 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
33f90 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
33fa0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
33fb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
33fc0 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
33fd0 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
33fe0 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
33ff0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
34000 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
34010 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
34020 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
34030 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
34040 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
34050 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
34060 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
34070 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
34080 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
34090 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
340a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
340b0 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
340c0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
340d0 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
340e0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
340f0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
34100 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
34110 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
34120 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
34130 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
34140 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
34150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34160 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
34170 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
34180 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
34190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341a0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
341b0 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
341c0 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
341d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
341e0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
341f0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
34200 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
34210 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
34220 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
34230 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34240 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
34250 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
34260 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
34270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34280 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
34290 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
342a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
342b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
342c0 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
342d0 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
342e0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
342f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34300 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
34310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
34320 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67  RRUPT_DB || iPag
34330 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
34340 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
34350 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
34360 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50  age );..  if( iP
34370 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53  age<2 ) return S
34380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34390 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  PT;.  if( pMemPa
343a0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
343b0 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
343c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
343d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
343e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
343f0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
34400 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
34410 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
34420 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
34430 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
34440 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
34450 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34460 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
34470 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
34480 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34490 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
344a0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
344b0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
344c0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
344d0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
344e0 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  ;..  if( pBt->bt
344f0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
34500 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
34510 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
34520 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
34530 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
34540 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
34550 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
34560 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
34570 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
34580 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
34590 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
345a0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
345b0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
345c0 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
345d0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
345e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
345f0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
34600 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
34610 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
34620 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
34630 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
34640 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
34650 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
34660 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
34670 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
34680 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
34690 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
346a0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
346b0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
346c0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
346d0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
346e0 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
346f0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70  OVACUUM ){.    p
34700 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
34710 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
34720 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20  PAGE, 0, &rc);. 
34730 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
34740 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
34750 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
34760 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
34770 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
34780 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
34790 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
347a0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
347b0 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
347c0 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
347d0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
347e0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
347f0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
34800 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
34810 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
34820 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
34830 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
34840 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
34850 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
34860 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
34870 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
34880 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
34890 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
348a0 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
348b0 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
348c0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
348d0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
348e0 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
348f0 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
34900 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
34910 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20    u32 nLeaf;    
34920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
34930 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
34940 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
34950 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
34960 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
34970 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
34980 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
34990 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
349a0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
349b0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
349c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
349d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
349e0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
349f0 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
34a00 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
34a10 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61  aData[4]);.    a
34a20 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
34a30 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20  leSize>32 );.   
34a40 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33   if( nLeaf > (u3
34a50 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
34a60 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
34a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
34a80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
34a90 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34aa0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
34ab0 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70  ( nLeaf < (u32)p
34ac0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
34ad0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
34ae0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34af0 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
34b00 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
34b10 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
34b20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
34b30 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
34b40 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
34b50 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
34b60 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
34b70 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
34b80 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
34b90 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
34ba0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
34bb0 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
34bc0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
34bd0 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
34be0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
34bf0 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
34c00 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
34c10 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
34c20 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
34c30 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
34c40 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
34c50 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
34c60 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
34c70 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
34c80 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
34c90 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
34ca0 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
34cb0 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
34cc0 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
34cd0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
34ce0 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
34cf0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34d00 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
34d10 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
34d20 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
34d30 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
34d40 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
34d50 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
34d60 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
34d70 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
34d80 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
34d90 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
34da0 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
34db0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
34dc0 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
34dd0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
34de0 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
34df0 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
34e00 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
34e10 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
34e20 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
34e30 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
34e40 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32  DENCE-OF: R-1992
34e50 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c  0-11576 However,
34e60 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
34e70 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a  of SQLite still.
34e80 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75        ** avoid u
34e90 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69  sing the last si
34ea0 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  x entries in the
34eb0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34ec0 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20  page array in.  
34ed0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61      ** order tha
34ee0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
34ef0 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65   created by newe
34f00 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
34f10 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20  Lite can be.    
34f20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64    ** read by old
34f30 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
34f40 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  QLite..      */.
34f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34f60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
34f70 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
34f80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34fa0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
34fb0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
34fc0 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
34fd0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
34fe0 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
34ff0 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
35000 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
35010 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
35020 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
35030 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
35040 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
35050 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
35060 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
35070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
35080 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
35090 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
350a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
350b0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
350c0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
350d0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
350e0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
350f0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
35100 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
35110 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
35120 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
35130 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
35140 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
35150 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
35160 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
35170 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
35180 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
35190 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
351a0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
351b0 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
351c0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
351d0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
351e0 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
351f0 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
35200 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
35210 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
35220 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
35230 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
35240 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
35250 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
35260 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
35270 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
35280 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
35290 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
352a0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
352b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
352c0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
352d0 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
352e0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
352f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
35300 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
35310 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
35320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35330 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
35340 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
35350 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
35360 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
35370 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
35380 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
35390 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
353a0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
353b0 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
353c0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
353d0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
353e0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
353f0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
35400 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
35410 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
35420 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
35430 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
35440 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
35450 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
35460 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
35470 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
35480 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
35490 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
354a0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
354b0 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
354c0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
354d0 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
354e0 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
354f0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
35500 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
35510 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
35520 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
35530 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
35540 20 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20    Store.** size 
35550 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
35560 74 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49  t the cell in pI
35570 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nfo..*/.static i
35580 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20  nt clearCell(.  
35590 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
355a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
355b0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
355c0 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  ns the Cell */. 
355d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
355e0 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72  pCell,    /* Fir
355f0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43  st byte of the C
35600 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ell */.  CellInf
35610 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
35620 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d    /* Size inform
35630 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
35640 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  cell */.){.  BtS
35650 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67  hared *pBt;.  Pg
35660 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
35670 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
35680 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61  fl;.  u32 ovflPa
35690 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
356a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
356b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
356c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
356d0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
356e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
356f0 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  nfo);.  if( pInf
35700 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f  o->nLocal==pInfo
35710 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ->nPayload ){.  
35720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35730 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
35740 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
35750 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
35760 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
35770 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
35780 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  l + pInfo->nSize
35790 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61   == pPage->aData
357a0 45 6e 64 20 29 3b 0a 20 20 74 65 73 74 63 61 73  End );.  testcas
357b0 65 28 20 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66  e( pCell + (pInf
357c0 6f 2d 3e 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70  o->nSize-1) == p
357d0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
357e0 3b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 2b 20  ;.  if( pCell + 
357f0 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70  pInfo->nSize > p
35800 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
35810 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78  {.    /* Cell ex
35820 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
35830 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 65  f page */.    re
35840 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
35850 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
35860 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
35870 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
35880 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   + pInfo->nSize 
35890 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  - 4);.  pBt = pP
358a0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
358b0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
358c0 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
358d0 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
358e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
358f0 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66  .  nOvfl = (pInf
35900 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49  o->nPayload - pI
35910 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  nfo->nLocal + ov
35920 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
35930 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
35940 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20  assert( nOvfl>0 
35950 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54  || .    (CORRUPT
35960 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e  _DB && (pInfo->n
35970 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61  Payload + ovflPa
35980 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65  geSize)<ovflPage
35990 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69  Size).  );.  whi
359a0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
359b0 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
359c0 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
359d0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
359e0 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
359f0 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
35a00 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
35a10 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
35a20 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
35a30 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
35a40 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
35a50 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
35a60 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
35a70 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
35a80 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
35a90 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
35aa0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
35ab0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
35ac0 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
35ad0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35ae0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
35af0 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
35b00 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
35b10 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
35b20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
35b30 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
35b40 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
35b50 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
35b60 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
35b70 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
35b80 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
35b90 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
35ba0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
35bb0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
35bc0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
35bd0 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
35be0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
35bf0 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
35c00 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
35c10 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
35c20 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
35c30 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
35c40 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
35c50 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
35c60 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
35c70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
35c80 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
35c90 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
35ca0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
35cb0 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
35cc0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
35cd0 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
35ce0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
35cf0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
35d00 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
35d10 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
35d20 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
35d30 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
35d40 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
35d50 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
35d60 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
35d70 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
35d80 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
35d90 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
35da0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
35db0 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
35dc0 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
35dd0 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
35de0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
35df0 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
35e00 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
35e10 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
35e20 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
35e30 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
35e40 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
35e50 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
35e60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35e70 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
35e80 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
35e90 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
35ea0 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
35eb0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
35ec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35ed0 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
35ee0 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
35ef0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
35f00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
35f10 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
35f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
35f30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
35f40 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
35f50 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
35f60 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
35f70 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
35f80 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
35f90 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
35fa0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
35fb0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
35fc0 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
35fd0 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
35fe0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
35ff0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
36000 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
36010 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
36020 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
36030 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
36040 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
36050 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
36060 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
36070 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
36080 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
36090 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
360a0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
360b0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
360c0 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
360d0 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
360e0 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
360f0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
36100 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
36110 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
36120 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
36130 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
36140 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
36150 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
36160 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
36170 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
36180 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
36190 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
361a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
361b0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
361c0 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
361d0 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
361e0 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f  const BtreePaylo
361f0 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f  ad *pX,        /
36200 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77  * Payload with w
36210 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63  hich to construc
36220 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  t the cell */.  
36230 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
36240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36250 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
36260 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
36270 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
36280 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
36290 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
362a0 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63  , mn;.  int spac
362b0 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
362c0 20 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20   *pToRelease;.  
362d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
362e0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
362f0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
36300 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
36310 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
36320 66 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65  fl;.  int nHeade
36330 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
36340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36350 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
36360 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
36370 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
36380 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
36390 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
363a0 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
363b0 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
363c0 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
363d0 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
363e0 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
363f0 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
36400 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
36410 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
36420 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d  Data[pPage->pBt-
36430 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
36440 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
36450 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36460 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36470 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
36480 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
36490 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
364a0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
364b0 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  e;.  if( pPage->
364c0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50  intKey ){.    nP
364d0 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61  ayload = pX->nDa
364e0 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a  ta + pX->nZero;.
364f0 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70      pSrc = pX->p
36500 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
36510 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20   pX->nData;.    
36520 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
36530 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20  ntKeyLeaf ); /* 
36540 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
36550 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61  y called for lea
36560 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64  ves */.    nHead
36570 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
36580 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
36590 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
365a0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
365b0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
365c0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
365d0 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  pX->nKey);.  }el
365e0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
365f0 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66  pX->nKey<=0x7fff
36600 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79  ffff && pX->pKey
36610 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20  !=0 );.    nSrc 
36620 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e  = nPayload = (in
36630 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20  t)pX->nKey;.    
36640 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b  pSrc = pX->pKey;
36650 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
36660 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
36670 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
36680 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20  yload);.  }.  . 
36690 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
366a0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61  payload */.  pPa
366b0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
366c0 48 65 61 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e  Header];.  if( n
366d0 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
366e0 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
366f0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
36700 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
36710 20 65 76 65 72 79 74 68 69 6e 67 20 66 69 74 73   everything fits
36720 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 70 61   on the btree pa
36730 67 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f  ge.    ** and no
36740 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
36750 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  are required. */
36760 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
36770 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
36780 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
36790 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
367a0 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
367b0 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
367c0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
367d0 20 20 20 61 73 73 65 72 74 28 20 6e 53 72 63 3c     assert( nSrc<
367e0 3d 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  =nPayload );.   
367f0 20 74 65 73 74 63 61 73 65 28 20 6e 53 72 63 3c   testcase( nSrc<
36800 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
36810 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
36820 20 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20   pSrc, nSrc);.  
36830 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
36840 64 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c  d+nSrc, 0, nPayl
36850 6f 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72  oad-nSrc);.    r
36860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36870 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
36880 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
36890 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
368a0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   some of the con
368b0 74 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20  tent will need. 
368c0 20 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74   ** to spill ont
368d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
368e0 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50  ..  */.  mn = pP
368f0 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
36900 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
36910 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
36920 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
36930 69 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65 73 74  ize - 4);.  test
36940 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
36950 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
36960 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
36970 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
36980 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
36990 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
369a0 6d 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  mn;.  spaceLeft 
369b0 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  = n;.  *pnSize =
369c0 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
369d0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
369e0 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a  ell[nHeader+n];.
369f0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30    pToRelease = 0
36a00 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  ;.  pgnoOvfl = 0
36a10 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
36a20 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  >pBt;..  /* At t
36a30 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
36a40 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
36a50 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
36a60 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
36a70 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
36a80 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
36a90 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
36aa0 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
36ab0 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
36ac0 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
36ad0 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
36ae0 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
36af0 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
36b00 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
36b10 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
36b20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
36b30 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
36b40 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
36b50 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
36b60 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
36b70 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
36b80 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
36b90 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
36ba0 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
36bb0 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
36bc0 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
36bd0 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
36be0 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
36bf0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
36c00 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
36c10 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
36c20 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
36c30 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
36c40 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
36c50 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
36c60 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
36c70 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
36c80 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
36c90 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
36ca0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
36cb0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
36cc0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
36cd0 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
36ce0 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79  =(int)(info.pPay
36cf0 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b  load - pCell) );
36d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66  .    assert( inf
36d10 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79  o.nKey==pX->nKey
36d20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36d30 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
36d40 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
36d50 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
36d60 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
36d70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
36d80 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
36d90 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
36da0 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
36db0 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
36dc0 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
36dd0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 6e  hile( 1 ){.    n
36de0 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
36df0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
36e00 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
36e10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
36e20 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
36e30 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
36e40 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
36e50 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
36e60 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
36e70 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
36e80 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
36e90 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
36ea0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
36eb0 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
36ec0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36ed0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
36ee0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
36ef0 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
36f00 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
36f10 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
36f20 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
36f30 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
36f40 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
36f50 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
36f60 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
36f70 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
36f80 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
36f90 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
36fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36fb0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36fc0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
36fd0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
36fe0 69 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20  if( nSrc>=n ){. 
36ff0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
37000 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
37010 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53      }else if( nS
37020 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  rc>0 ){.      n 
37030 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 6d 65  = nSrc;.      me
37040 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
37050 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
37060 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
37070 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
37080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
37090 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  load -= n;.    i
370a0 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29  f( nPayload<=0 )
370b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 50 61 79   break;.    pPay
370c0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
370d0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
370e0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
370f0 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
37100 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
37110 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  0 ){.      MemPa
37120 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23  ge *pOvfl = 0;.#
37130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37140 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
37150 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
37160 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
37170 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
37180 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37190 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
371a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
371b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
371c0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
371d0 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
371e0 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
371f0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
37200 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
37210 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
37220 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
37230 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
37240 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
37250 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
37260 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
37270 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
37280 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
37290 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
372a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
372b0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
372c0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
372d0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
372e0 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
372f0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
37300 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
37310 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
37320 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
37330 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
37340 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
37350 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
37360 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
37370 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
37380 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
37390 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
373a0 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
373b0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
373c0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
373d0 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
373e0 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
373f0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
37400 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
37410 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
37420 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
37430 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
37440 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
37450 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
37460 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
37470 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
37480 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
37490 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
374a0 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
374b0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
374c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
374d0 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
374e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
374f0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
37500 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
37510 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
37520 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
37530 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
37540 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
37550 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
37560 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
37570 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37580 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37590 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
375a0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
375b0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
375c0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
375d0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
375e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
375f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
37600 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
37610 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
37620 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
37630 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
37640 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
37650 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
37660 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
37670 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
37680 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
37690 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
376a0 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
376b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
376c0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
376d0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
376e0 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
376f0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
37700 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
37710 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
37720 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
37730 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
37740 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
37750 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
37760 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
37770 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
37780 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
37790 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
377a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
377b0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
377c0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
377d0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
377e0 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
377f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
37800 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
37810 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
37820 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
37830 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
37840 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
37850 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
37860 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
37870 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
37880 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
37890 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
378a0 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
378b0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
378c0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
378d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
378e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
378f0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
37900 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
37910 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
37920 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
37930 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
37940 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
37950 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
37960 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
37970 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
37980 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
37990 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
379a0 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
379b0 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
379c0 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
379d0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
379e0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
379f0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
37a00 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
37a10 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
37a20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
37a30 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
37a40 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
37a50 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
37a60 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
37a70 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
37a80 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
37a90 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
37aa0 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
37ab0 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
37ac0 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
37ad0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
37ae0 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
37af0 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
37b00 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
37b10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
37b20 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
37b30 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
37b40 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
37b50 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
37b60 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
37b70 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
37b80 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
37b90 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
37ba0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
37bb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
37bc0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
37bd0 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
37be0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
37bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
37c00 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37c10 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
37c20 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
37c30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37c40 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
37c50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
37c60 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
37c70 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
37c80 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
37c90 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
37ca0 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
37cb0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
37cc0 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
37cd0 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
37ce0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
37cf0 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
37d00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
37d10 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
37d20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
37d30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
37d40 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
37d50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
37d60 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
37d70 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
37d80 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
37d90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
37da0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
37db0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
37dc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
37dd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
37de0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ll==0 ){.    mem
37df0 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
37e00 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74  , 0, 4);.    dat
37e10 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
37e20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
37e30 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+5], pPage->
37e40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
37e50 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
37e60 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ee = pPage->pBt-
37e70 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50  >usableSize - pP
37e80 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20  age->hdrOffset. 
37e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ea0 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63        - pPage->c
37eb0 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b  hildPtrSize - 8;
37ec0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
37ed0 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
37ee0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
37ef0 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70  l - idx));.    p
37f00 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
37f10 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
37f20 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
37f30 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  nFree += 2;.  }.
37f40 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
37f50 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
37f60 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
37f70 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
37f80 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
37f90 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
37fa0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
37fb0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
37fc0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
37fd0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
37fe0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
37ff0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
38000 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
38010 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
38020 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
38030 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
38040 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
38050 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
38060 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
38070 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
38080 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
38090 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
380a0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
380b0 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
380c0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
380d0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
380e0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
380f0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
38100 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
38110 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
38120 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
38130 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
38140 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
38150 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d  ed..**.** *pRC m
38160 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b  ust be SQLITE_OK
38170 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
38180 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
38190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
381a0 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
381b0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
381c0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
381d0 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
381e0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
381f0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
38200 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
38210 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
38220 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
38230 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
38240 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
38250 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
38260 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
38270 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
38280 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
38290 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
382a0 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
382b0 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
382c0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
382d0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
382e0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
382f0 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
38300 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
38310 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
38320 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
38330 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
38340 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
38350 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
38360 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
38370 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
38380 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
38390 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
383a0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
383b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
383c0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  unter */.  u8 *d
383d0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
383e0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
383f0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
38400 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20  .  u8 *pIns;    
38410 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
38420 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  t in pPage->aCel
38430 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20  lIdx[] where no 
38440 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f  cell inserted */
38450 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 43  ..  assert( *pRC
38460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
38470 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
38480 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
38490 2b 70 50 61 67 65 2d 3e