/ Hex Artifact Content
Login

Artifact 48b4ced9555171d4a5800ae65ef491dac12d1aa9706f09e3f76f3c6e0bff7a41:


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: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7170: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
7180: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
7190: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
71a0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
71b0: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
71c0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
71d0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
71e0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
71f0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
7200: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
7210: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
7220: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
7230: 53 69 6d 28 34 31 30 29 20 29 7b 0a 20 20 20 20  Sim(410) ){.    
7240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
7250: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
7260: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
7270: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
7280: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
7290: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
72a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
72b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
72c0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
72d0: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
72e0: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
72f0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
7300: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
7310: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
7320: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
7330: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
7340: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
7350: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
7360: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
7370: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
7380: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
7390: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
73a0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
73b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
73c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
73d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
73e0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
73f0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
7400: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
7410: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
7420: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
7430: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7440: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
7450: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
7460: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
7470: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
7480: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
7490: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
74a0: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
74b0: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
74c0: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
74d0: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
74e0: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
74f0: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
7500: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
7510: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
7520: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
7530: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
7540: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
7550: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
7560: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
7570: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
7580: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
7590: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
75a0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
75b0: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
75c0: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
75d0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
75e0: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
75f0: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7600: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
7610: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
7620: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
7630: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
7640: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
7650: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
7660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
7670: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7680: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7690: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
76a0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
76b0: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
76c0: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
76d0: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
76e0: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
76f0: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
7700: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
7710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
7720: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
7730: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
7740: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
7750: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
7760: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
7770: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
7780: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
7790: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
77a0: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
77b0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
77c0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
77d0: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
77e0: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
77f0: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
7800: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
7810: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
7820: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
7830: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
7840: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
7850: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
7860: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
7870: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
7880: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
7890: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
78a0: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
78b0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
78c0: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
78d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
78e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
78f0: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
7900: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
7910: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
7920: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
7930: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
7940: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
7950: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
7960: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
7970: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
7980: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
7990: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
79a0: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
79b0: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
79c0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
79d0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
79e0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
79f0: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
7a00: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
7a10: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
7a20: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
7a30: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
7a40: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
7a50: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
7a60: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
7a70: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
7a80: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
7a90: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
7aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
7ab0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
7ac0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
7ad0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
7ae0: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
7af0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7b00: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
7b10: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7b20: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
7b30: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7b40: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
7b50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
7b60: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
7b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7b80: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7b90: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
7ba0: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
7bb0: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
7bc0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
7bd0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7be0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
7bf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
7c00: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7c10: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
7c20: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7c30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
7c40: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7c50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7c60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7c70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7c80: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7c90: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7ca0: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7cb0: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7cc0: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7cd0: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7ce0: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7cf0: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7d00: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
7d10: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
7d20: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
7d30: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
7d40: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
7d50: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
7d60: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7d70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7d80: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7d90: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7da0: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7db0: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7dc0: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7dd0: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7de0: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7df0: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7e00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
7e10: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
7e20: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
7e30: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
7e40: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
7e50: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
7e60: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7e70: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7e80: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7e90: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7ea0: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7eb0: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7ec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ed0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7ee0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7ef0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7f00: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
7f10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
7f20: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
7f30: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
7f40: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
7f50: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
7f60: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
7f70: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
7f80: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7f90: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7fa0: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7fb0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7fc0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7fd0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7fe0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7ff0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
8000: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
8010: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
8020: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
8030: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
8040: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
8050: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
8060: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
8070: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
8080: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
8090: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
80a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
80b0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
80c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
80d0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
80e0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
80f0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
8100: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
8110: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
8120: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
8130: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
8140: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
8150: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
8160: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
8170: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
8180: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
8190: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
81a0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
81b0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
81c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
81d0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
81e0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
81f0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
8200: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
8210: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
8220: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
8230: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
8240: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
8250: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
8260: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
8270: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
8280: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
8290: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
82a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
82b0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
82c0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
82d0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
82e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
82f0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
8300: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8310: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
8320: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
8330: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
8340: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
8350: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8360: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8370: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
8380: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
8390: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
83a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
83b0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
83c0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
83d0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
83e0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
83f0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8400: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8410: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8420: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
8430: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
8440: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
8450: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8460: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8470: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
8480: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
8490: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
84a0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
84b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
84c0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
84d0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
84e0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
84f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
8500: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
8510: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
8520: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
8530: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
8540: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8550: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8560: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8570: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8580: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8590: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
85a0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
85b0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
85c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
85d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
85e0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
85f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 28 63  n;.  }.  if( ((c
8600: 68 61 72 2a 29 73 71 6c 69 74 65 33 50 61 67 65  har*)sqlite3Page
8610: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
8620: 65 29 29 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  e))[0]!=0 ){.   
8630: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 62 79   /* The first by
8640: 74 65 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  te of the extra 
8650: 64 61 74 61 20 69 73 20 74 68 65 20 4d 65 6d 50  data is the MemP
8660: 61 67 65 2e 69 73 49 6e 69 74 20 62 79 74 65 2e  age.isInit byte.
8670: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 61 74 20  .    ** If that 
8680: 62 79 74 65 20 69 73 20 73 65 74 2c 20 69 74 20  byte is set, it 
8690: 6d 65 61 6e 73 20 74 68 69 73 20 70 61 67 65 20  means this page 
86a0: 69 73 20 61 6c 73 6f 20 62 65 69 6e 67 20 75 73  is also being us
86b0: 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 62  ed.    ** as a b
86c0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
86d0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
86e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
86f0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
8700: 69 74 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  it;.  }.  offset
8710: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
8720: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
8730: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
8740: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8750: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8760: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
8770: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
8780: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
8790: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
87a0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
87b0: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
87c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
87d0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
87e0: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
87f0: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
8800: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8810: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
8820: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
8830: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
8840: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
8850: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8860: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
8870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8880: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
8890: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
88a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
88b0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
88c0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
88d0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
88e0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
88f0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
8900: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
8910: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8920: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
8930: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
8940: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
8950: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
8960: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
8970: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
8980: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8990: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
89a0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
89b0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
89c0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
89d0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
89e0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
89f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
8a00: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
8a10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
8a20: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
8a30: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
8a40: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8a50: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8a60: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8a70: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8a80: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8a90: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8aa0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8ab0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
8ac0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8ad0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
8ae0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8af0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
8b00: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
8b10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8b20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
8b30: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
8b40: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8b50: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
8b60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8b70: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
8b80: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
8b90: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8ba0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
8bb0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8bc0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
8bd0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
8be0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
8bf0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8c00: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8c10: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8c20: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8c30: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
8c40: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8c50: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8c60: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8c70: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8c80: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8c90: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8ca0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8cb0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
8cc0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
8cd0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8ce0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
8cf0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8d00: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8d10: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8d20: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8d30: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8d40: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8d50: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8d60: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8d70: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8d80: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8d90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8da0: 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61  RUPT_PGNO(iPtrma
8db0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
8dc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8dd0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8de0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8df0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8e00: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8e10: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8e20: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8e30: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8e40: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8e50: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
8e60: 20 7a 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   z, rc).#endif..
8e70: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8e80: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8e90: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8ea0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8eb0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8ec0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8ed0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8ee0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8ef0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8f00: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8f10: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8f20: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8f30: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8f40: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8f50: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8f60: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8f70: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8f80: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8f90: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8fa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8fb0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8fc0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8fd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8fe0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8ff0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
9000: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
9010: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
9020: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
9030: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
9040: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
9050: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
9060: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
9070: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
9080: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
9090: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
90a0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
90b0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
90c0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
90d0: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
90e0: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
90f0: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
9100: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9110: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
9120: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
9130: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
9140: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
9150: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
9160: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
9170: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
9180: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
9190: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
91a0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
91b0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
91c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
91d0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
91e0: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
91f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9200: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9210: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9220: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9230: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9240: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9250: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9260: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9270: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9280: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9290: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
92a0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
92b0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
92c0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
92d0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
92e0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
92f0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9300: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9310: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9320: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9330: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9340: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9350: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9360: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
9370: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
9380: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
9390: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
93a0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
93b0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
93c0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
93d0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
93e0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
93f0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9400: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9410: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9420: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9430: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9440: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9450: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9460: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
9470: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
9480: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
9490: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
94a0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
94b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
94c0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
94d0: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
94e0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
94f0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9500: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9510: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9520: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9530: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9540: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9550: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9560: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
9570: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
9580: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
9590: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
95a0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
95b0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
95c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95d0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
95e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
95f0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9600: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9610: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9620: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9630: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9640: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9650: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9660: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
9670: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
9680: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
9690: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
96a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
96b0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
96c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
96d0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
96e0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
96f0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9700: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9710: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9720: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9730: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9740: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9750: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9760: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
9770: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
9780: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
9790: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
97a0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
97b0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
97c0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
97d0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
97e0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
97f0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9800: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9810: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9820: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9830: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9840: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9850: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9860: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
9870: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
9880: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
9890: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
98a0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
98b0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
98c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
98d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
98e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
98f0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9900: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9910: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9920: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9930: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9940: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9950: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9960: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9970: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9980: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
99a0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
99b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
99c0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
99d0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
99e0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
99f0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9a00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9a10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9a20: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9a30: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9a40: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9a50: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9a60: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9a70: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
9a80: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
9a90: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
9aa0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9ab0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
9ac0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9ad0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9ae0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9af0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9b10: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9b20: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9b30: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9b40: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9b50: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9b60: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b80: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9b90: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9ba0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9bc0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9bd0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9be0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9c00: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9c10: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9c20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9c30: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9c40: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9c50: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9c60: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9c70: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9c80: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9c90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ca0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9cb0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
9cc0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9cd0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9ce0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9cf0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9d00: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9d10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9d20: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9d30: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9d40: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9d50: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9d60: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9d70: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9d80: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9d90: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9da0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9db0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9dc0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9dd0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9de0: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9df0: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9e00: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9e10: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9e20: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9e30: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9e40: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9e50: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9e60: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9e70: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9e80: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9e90: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9ea0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9eb0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9ec0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9ed0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9ee0: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9ef0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9f00: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9f10: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9f20: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9f30: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9f40: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9f50: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9f60: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9f70: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9f80: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9f90: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9fa0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9fb0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9fc0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9fd0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9ff0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
a000: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
a010: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
a020: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
a030: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
a040: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
a050: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
a060: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
a070: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a080: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
a090: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
a0a0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
a0b0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
a0c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a0d0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
a0e0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
a0f0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
a100: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
a110: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
a120: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
a130: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
a140: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
a150: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
a160: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
a170: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
a180: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
a190: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
a1a0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
a1b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a1c0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
a1d0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
a1e0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
a1f0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
a200: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
a210: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
a220: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
a230: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
a240: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a250: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a270: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a280: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a290: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a2a0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a2b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a2c0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a2d0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a2e0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a2f0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a300: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a310: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a320: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a330: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a350: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a360: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a370: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a380: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a390: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a3a0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a3b0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a3c0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a3d0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a3e0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a3f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a400: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a410: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a420: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a430: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a440: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a450: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a460: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a470: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a480: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a490: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a4a0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a4b0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a4c0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a4d0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a4e0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a4f0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a500: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a510: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a520: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a530: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a540: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a550: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a580: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a590: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a5a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a5b0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a5c0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a5d0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a5e0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a5f0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a600: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a610: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a620: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a630: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a640: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a650: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a660: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a670: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a680: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a690: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a6a0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a6c0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a6d0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a6e0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a6f0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a700: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a710: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a720: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a730: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a740: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a750: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a770: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a780: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a790: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a7a0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a7b0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a7c0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a7d0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a7e0: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a7f0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a800: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a810: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a820: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a830: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a840: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a850: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a860: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a870: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a880: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a890: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a8a0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a8b0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a8c0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a8d0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a8e0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a8f0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a900: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a910: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a920: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a930: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a940: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a950: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a960: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a970: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a980: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a990: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a9b0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a9c0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a9d0: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a9e0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a9f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
aa00: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
aa10: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
aa20: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aa30: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
aa40: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
aa50: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
aa60: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
aa90: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
aaa0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aad0: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
aae0: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
aaf0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
ab00: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ab10: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
ab20: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
ab30: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
ab40: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
ab50: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
ab60: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
ab70: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
ab80: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
ab90: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
aba0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
abb0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
abc0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
abd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
abe0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
abf0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
ac00: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
ac10: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
ac20: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
ac30: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ac40: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
ac50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
ac60: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
ac70: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
ac80: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
ac90: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
aca0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
acb0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
acc0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
acd0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
ace0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
acf0: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
ad00: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
ad10: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
ad20: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
ad30: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
ad40: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
ad50: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
ad60: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
ad70: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
ad80: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
ad90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
ada0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
adb0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
adc0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
add0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ade0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
adf0: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ae00: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ae10: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ae20: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ae30: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ae40: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ae60: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
ae70: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
ae80: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
ae90: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
aea0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
aeb0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
aec0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
aed0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
aee0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
aef0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
af00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
af10: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
af20: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
af30: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
af40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
af50: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
af60: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af70: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af80: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
af90: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
afa0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
afb0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
afc0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
afd0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
afe0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
aff0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
b000: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
b010: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
b020: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
b030: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
b040: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
b050: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
b060: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
b070: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
b080: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
b090: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
b0a0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
b0b0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
b0c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
b0d0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
b0e0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
b0f0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
b100: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
b110: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b120: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
b130: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b140: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b150: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
b160: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
b170: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
b180: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
b190: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
b1a0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
b1b0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
b1c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
b1d0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
b1e0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
b1f0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
b200: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
b210: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
b220: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
b230: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
b240: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
b250: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b260: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b270: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
b280: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
b290: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b2a0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
b2b0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b2c0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b2d0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b2e0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b2f0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b300: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b310: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b320: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b330: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b340: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b350: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b360: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b370: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b380: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b390: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b3a0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b3b0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b3c0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b3d0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b3e0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b3f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b400: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b410: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b420: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b430: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b440: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b460: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
b470: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 73  he cell pCell is
b480: 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20   currently part 
b490: 6f 66 20 70 61 67 65 20 70 53 72 63 20 62 75 74  of page pSrc but
b4a0: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
b4b0: 20 62 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20 70   be part.** of p
b4c0: 50 61 67 65 2e 20 20 28 70 53 72 63 20 61 6e 64  Page.  (pSrc and
b4d0: 20 70 50 61 67 65 72 20 61 72 65 20 6f 66 74 65   pPager are ofte
b4e0: 6e 20 74 68 65 20 73 61 6d 65 2e 29 20 20 49 66  n the same.)  If
b4f0: 20 70 43 65 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   pCell contains 
b500: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
b510: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
b520: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
b530: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
b540: 65 72 2d 6d 61 70 20 66 6f 72 0a 2a 2a 20 74 68  er-map for.** th
b550: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
b560: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 61 6c  that will be val
b570: 69 64 20 61 66 74 65 72 20 70 43 65 6c 6c 20 68  id after pCell h
b580: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 74 6f  as been moved to
b590: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
b5a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
b5b0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
b5c0: 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
b5d0: 2a 70 53 72 63 2c 20 75 38 20 2a 70 43 65 6c 6c  *pSrc, u8 *pCell
b5e0: 2c 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65  ,int *pRC){.  Ce
b5f0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
b600: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
b610: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
b620: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
b630: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b640: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
b650: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
b660: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
b670: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
b680: 66 6c 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  fl;.    if( SQLI
b690: 54 45 5f 57 49 54 48 49 4e 28 70 53 72 63 2d 3e  TE_WITHIN(pSrc->
b6a0: 61 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c  aDataEnd, pCell,
b6b0: 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63   pCell+info.nLoc
b6c0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  al) ){.      tes
b6d0: 74 63 61 73 65 28 20 70 53 72 63 21 3d 70 50 61  tcase( pSrc!=pPa
b6e0: 67 65 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 43  ge );.      *pRC
b6f0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b700: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b710: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b720: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b730: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b740: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b750: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b760: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b770: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b780: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b790: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b7a0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b7b0: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b7c0: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b7d0: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b7e0: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b7f0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b800: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b810: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b820: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b830: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b840: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b850: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b860: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b870: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b880: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b890: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b8a0: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b8b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b8c0: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b8d0: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b8e0: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b8f0: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b900: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b910: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b920: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b930: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b940: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b950: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b960: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
b970: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
b980: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
b990: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
b9a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b9b0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b9c0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
b9d0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b9e0: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
b9f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba10: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
ba20: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba40: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
ba50: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
ba60: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ba80: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
ba90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
baa0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bab0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bac0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
bad0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
bae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
baf0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
bb00: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
bb10: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
bb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb30: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
bb40: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bb50: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
bb80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bb90: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
bba0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
bbb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bbc0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
bbd0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
bbe0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
bbf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
bc00: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
bc10: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bc20: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bc30: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bc40: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bc50: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
bc60: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bc70: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bc80: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bc90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bca0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bcb0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bcc0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bcd0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bce0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bcf0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bd00: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bd10: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bd20: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bd30: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bd40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bd50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bd60: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bd70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bd80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bdb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bdc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdd0: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bde0: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bdf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
be00: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
be10: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
be20: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
be30: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
be40: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
be50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
be60: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
be70: 61 5b 68 64 72 2b 33 5d 29 20 7c 7c 20 43 4f 52  a[hdr+3]) || COR
be80: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 69 43 65  RUPT_DB );.  iCe
be90: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bea0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
beb0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
bec0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bed0: 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  eSize;..  /* Thi
bee0: 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20  s block handles 
bef0: 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f  pages with two o
bf00: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f  r fewer free blo
bf10: 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67  cks and nMaxFrag
bf20: 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66  .  ** or fewer f
bf30: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e  ragmented bytes.
bf40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
bf50: 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f   is faster to mo
bf60: 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  ve the.  ** two 
bf70: 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20  (or one) blocks 
bf80: 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d  of cells using m
bf90: 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64  emmove() and add
bfa0: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20   the required.  
bfb0: 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61  ** offsets to ea
bfc0: 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ch pointer in th
bfd0: 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
bfe0: 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20  rray than it is 
bff0: 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74  to .  ** reconst
c000: 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20  ruct the entire 
c010: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  page.  */.  if( 
c020: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
c030: 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20  <=nMaxFrag ){.  
c040: 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65    int iFree = ge
c050: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c060: 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46  +1]);.    if( iF
c070: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  ree>usableSize-4
c080: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c090: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c0a0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 46  age);.    if( iF
c0b0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ree ){.      int
c0c0: 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79   iFree2 = get2by
c0d0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29  te(&data[iFree])
c0e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  ;.      if( iFre
c0f0: 65 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  e2>usableSize-4 
c100: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c110: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c120: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ge);.      if( 0
c130: 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74  ==iFree2 || (dat
c140: 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20  a[iFree2]==0 && 
c150: 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d  data[iFree2+1]==
c160: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  0) ){.        u8
c170: 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63   *pEnd = &data[c
c180: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
c190: 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  l*2];.        u8
c1a0: 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20   *pAddr;.       
c1b0: 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20   int sz2 = 0;.  
c1c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67        int sz = g
c1d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
c1e0: 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ree+2]);.       
c1f0: 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62   int top = get2b
c200: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  );.        if( t
c220: 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20  op>=iFree ){.   
c230: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c240: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c250: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c260: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c270: 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20  iFree2 ){.      
c280: 20 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a      if( iFree+sz
c290: 3e 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e  >iFree2 ) return
c2a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c2b0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c2c0: 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74         sz2 = get
c2d0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
c2e0: 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  e2+2]);.        
c2f0: 20 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32    if( iFree2+sz2
c300: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20   > usableSize ) 
c310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c320: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
c340: 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65  move(&data[iFree
c350: 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b  +sz+sz2], &data[
c360: 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65  iFree+sz], iFree
c370: 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20  2-(iFree+sz));. 
c380: 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73           sz += s
c390: 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  z2;.        }els
c3a0: 65 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 75  e if( iFree+sz>u
c3b0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c3c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c3e0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c3f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 62 72    }..        cbr
c400: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c410: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c420: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c430: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c440: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c450: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c460: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c470: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c480: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c490: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c4a0: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c4b0: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c4c0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c4d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c4e0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c4f0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c500: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c510: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c520: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c530: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c550: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c560: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c570: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c590: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c5a0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c5b0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c5c0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c5d0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c5e0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c5f0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c600: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c610: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c620: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c630: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c640: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c650: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c660: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c670: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c680: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c690: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c6a0: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c6b0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c6c0: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c6d0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c6e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c6f0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c700: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c720: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c730: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c740: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c750: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c760: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c770: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c780: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c790: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c7a0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c7b0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c7c0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c7d0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c800: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c810: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c820: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c830: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c840: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c850: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c860: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c870: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c880: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c890: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c8a0: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c8b0: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c8c0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c8d0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c8e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8f0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c900: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c910: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c920: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c930: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c940: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c950: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c960: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c970: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c980: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c9a0: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c9b0: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c9c0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c9d0: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c9e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c9f0: 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ->nFree>=0 );.  
ca00: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
ca10: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
ca20: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
ca30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ca40: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ca50: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
ca60: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
ca70: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
ca80: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ca90: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
caa0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
cab0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
cac0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
cad0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
cae0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
caf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cb00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
cb10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
cb20: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
cb30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cb40: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
cb50: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
cb60: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
cb70: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
cb80: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
cb90: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
cba0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
cbb0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
cbc0: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
cbd0: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
cbe0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
cbf0: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
cc00: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
cc10: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
cc20: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
cc30: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
cc40: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
cc50: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
cc60: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
cc70: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
cc80: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
cc90: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
cca0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
ccb0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
ccc0: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
ccd0: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
cce0: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
ccf0: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
cd00: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
cd10: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
cd20: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
cd30: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
cd40: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
cd50: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
cd60: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
cd70: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
cd80: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
cd90: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
cda0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
cdb0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
cdc0: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
cdd0: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
cde0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
cdf0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
ce00: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ce10: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
ce20: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  Page data */.  i
ce50: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
ce60: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
ce70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ce80: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 70  ress of ptr to p
ce90: 63 20 2a 2f 0a 20 20 69 6e 74 20 70 63 20 3d 20  c */.  int pc = 
cea0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
ceb0: 69 41 64 64 72 5d 29 3b 20 20 20 20 20 20 20 20  iAddr]);        
cec0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ced0: 61 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  a free slot */. 
cee0: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
cf10: 78 63 65 73 73 20 73 69 7a 65 20 6f 66 20 74 68  xcess size of th
cf20: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  e slot */.  int 
cf30: 6d 61 78 50 43 20 3d 20 70 50 67 2d 3e 70 42 74  maxPC = pPg->pBt
cf40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 6e  ->usableSize - n
cf50: 42 79 74 65 3b 20 20 2f 2a 20 4d 61 78 20 61 64  Byte;  /* Max ad
cf60: 64 72 65 73 73 20 66 6f 72 20 61 20 75 73 61 62  dress for a usab
cf70: 6c 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74  le slot */.  int
cf80: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cfb0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
cfc0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
cfd0: 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  c>0 );.  while( 
cfe0: 70 63 3c 3d 6d 61 78 50 43 20 29 7b 0a 20 20 20  pc<=maxPC ){.   
cff0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d000: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
d010: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
d020: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
d030: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
d040: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
d050: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
d060: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
d070: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
d080: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
d090: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
d0a0: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
d0b0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
d0c0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
d0d0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
d0e0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
d0f0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
d100: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
d110: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
d120: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  3 );.      if( x
d130: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
d140: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d150: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
d160: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
d170: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
d180: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
d190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
d1a0: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
d1b0: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
d1c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
d1d0: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
d1e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
d1f0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
d200: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
d210: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
d220: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
d230: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
d240: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
d250: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
d260: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
d270: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
d280: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
d290: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
d2a0: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
d2b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 2b 70 63    }else if( x+pc
d2c0: 20 3e 20 6d 61 78 50 43 20 29 7b 0a 20 20 20 20   > maxPC ){.    
d2d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 6c 6f 74      /* This slot
d2e0: 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74 68 65   extends off the
d2f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 75 73 61 62   end of the usab
d300: 6c 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  le part of the p
d310: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a  age */.        *
d320: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d330: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
d350: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d360: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
d370: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
d380: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
d390: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
d3a0: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
d3b0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
d3c0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
d3d0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
d3e0: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
d3f0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
d400: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
d410: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
d420: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
d430: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
d440: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
d450: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
d460: 20 20 20 69 66 28 20 70 63 3c 3d 69 41 64 64 72     if( pc<=iAddr
d470: 2b 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  +size ){.      i
d480: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 20 20 20  f( pc ){.       
d490: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 6c 6f   /* The next slo
d4a0: 74 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20 69  t in the chain i
d4b0: 73 20 6e 6f 74 20 70 61 73 74 20 74 68 65 20 65  s not past the e
d4c0: 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
d4d0: 74 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  t slot */.      
d4e0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
d4f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
d500: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
d520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 3e 6d 61  .  }.  if( pc>ma
d530: 78 50 43 2b 6e 42 79 74 65 2d 34 20 29 7b 0a 20  xPC+nByte-4 ){. 
d540: 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65 20 73     /* The free s
d550: 6c 6f 74 20 63 68 61 69 6e 20 65 78 74 65 6e 64  lot chain extend
d560: 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  s off the end of
d570: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
d580: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
d590: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29  ORRUPT_PAGE(pPg)
d5a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d5c0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d5d0: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d5e0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d5f0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d600: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d610: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d620: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d630: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d640: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d650: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d660: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d670: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d680: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d690: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d6a0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d6b0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d6c0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d6d0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d6e0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d6f0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d700: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d710: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d720: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d730: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d740: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d750: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d760: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d770: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d780: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d790: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d7a0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d7b0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d7c0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d7d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d7e0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d7f0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d800: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d810: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d820: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d830: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d850: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d860: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d870: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d880: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d890: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d8a0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d8b0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d8c0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d8d0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d8e0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d8f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d900: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d910: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d920: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d940: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d950: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d960: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d970: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d990: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d9a0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d9b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d9c0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d9d0: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d9e0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d9f0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
da00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
da10: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
da20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
da30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
da40: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
da50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
da60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
da70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
da80: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
da90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
daa0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
dab0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
dac0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
dad0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
dae0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
daf0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
db00: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
db10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
db20: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
db30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
db40: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
db50: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
db60: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
db70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
db80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
db90: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
dba0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
dbb0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
dbc0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
dbd0: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
dbe0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
dbf0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
dc00: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
dc10: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
dc20: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
dc30: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
dc40: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
dc50: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
dc60: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
dc70: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
dc80: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
dc90: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
dca0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
dcb0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
dcc0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
dcd0: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
dce0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
dcf0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
dd00: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
dd10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
dd20: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
dd30: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
dd50: 2a 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74  * by btreeComput
dd60: 65 46 72 65 65 53 70 61 63 65 28 29 20 2a 2f 0a  eFreeSpace() */.
dd70: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
dd80: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
dd90: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
dda0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
ddb0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ddc0: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ddd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
dde0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
ddf0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
de00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
de10: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
de20: 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20  ace between gap 
de30: 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20  and top for one 
de40: 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65  more cell pointe
de50: 72 2c 0a 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  r,.  ** and if t
de60: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e  he freelist is n
de70: 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73  ot empty, then s
de80: 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66  earch the.  ** f
de90: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
dea0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
deb0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
dec0: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
ded0: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
dee0: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
def0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
df00: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
df10: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
df20: 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32   if( (data[hdr+2
df30: 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d  ] || data[hdr+1]
df40: 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20  ) && gap+2<=top 
df50: 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63  ){.    u8 *pSpac
df60: 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  e = pageFindSlot
df70: 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26  (pPage, nByte, &
df80: 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70  rc);.    if( pSp
df90: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ace ){.      ass
dfa0: 65 72 74 28 20 70 53 70 61 63 65 2b 6e 42 79 74  ert( pSpace+nByt
dfb0: 65 3c 3d 64 61 74 61 2b 70 50 61 67 65 2d 3e 70  e<=data+pPage->p
dfc0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
dfd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
dfe0: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
dff0: 65 2d 64 61 74 61 29 29 3c 3d 67 61 70 20 29 7b  e-data))<=gap ){
e000: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
e010: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
e020: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
e030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e050: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
e060: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
e070: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
e080: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e090: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
e0a0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
e0b0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
e0c0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
e0d0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
e0e0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
e0f0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
e100: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
e110: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
e120: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
e130: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
e140: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
e150: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
e160: 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  T_DB );.    asse
e170: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
e180: 3e 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  >=0 );.    rc = 
e190: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
e1a0: 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61  Page, MIN(4, pPa
e1b0: 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e  ge->nFree - (2+n
e1c0: 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28  Byte)));.    if(
e1d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
e1e0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
e1f0: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
e200: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
e210: 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74  sert( gap+2+nByt
e220: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
e230: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
e240: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
e250: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
e260: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
e270: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
e280: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
e290: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 43 6f  ea.  The btreeCo
e2a0: 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28 29  mputeFreeSpace()
e2b0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
e2c0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
e2d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
e2e0: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
e2f0: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
e300: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
e310: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
e320: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
e330: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
e340: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
e350: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
e360: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
e370: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
e380: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
e390: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
e3a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e3b0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
e3c0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
e3d0: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
e3e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
e3f0: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
e400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e410: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
e420: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
e430: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
e440: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
e450: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
e460: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
e470: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
e480: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
e490: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
e4a0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
e4b0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
e4c0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
e4d0: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
e4e0: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  alesced..**.** E
e4f0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
e500: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
e510: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
e520: 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61  eeComputeFreeSpa
e530: 63 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ce(),.** that ro
e540: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
e550: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
e560: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
e570: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
e580: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
e590: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
e5a0: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
e5b0: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
e5c0: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
e5d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e5e0: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
e5f0: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
e600: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
e610: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
e620: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
e630: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
e640: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
e650: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
e660: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
e670: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
e680: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
e690: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
e6a0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
e6d0: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
e6e0: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
e6f0: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e710: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
e720: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
e730: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
e760: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
e770: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
e780: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
e7b0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
e7c0: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
e7d0: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7f0: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
e800: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36  f iSize */.  u16
e810: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
e840: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e850: 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  a */.  u32 iEnd 
e860: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
e870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e880: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
e890: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
e8a0: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
e8b0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
e8c0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
e8d0: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
e8e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e8f0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
e900: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e910: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
e920: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e930: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e940: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
e950: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
e960: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
e970: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
e980: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
e990: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
e9a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e9b0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
e9c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e9d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e9e0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e9f0: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
ea00: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
ea10: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
ea20: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
ea30: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ea40: 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a  eSize-4 );..  /*
ea50: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
ea60: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
ea70: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
ea80: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
ea90: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
eaa0: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
eab0: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
eac0: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
ead0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
eae0: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
eaf0: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
eb00: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
eb10: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
eb20: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
eb30: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
eb40: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
eb50: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
eb60: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
eb70: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
eb80: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
eb90: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
eba0: 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  )<iStart ){.    
ebb0: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
ebc0: 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  Ptr+4 ){.       
ebd0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30   if( iFreeBlk==0
ebe0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ebf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ec00: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
ec10: 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
ec20: 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42     iPtr = iFreeB
ec30: 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  lk;.    }.    if
ec40: 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65  ( iFreeBlk>pPage
ec50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
ec60: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  e-4 ){.      ret
ec70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ec80: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
ec90: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
eca0: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
ecb0: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
ecc0: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
ecd0: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
ece0: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
ecf0: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
ed00: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
ed10: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
ed20: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
ed30: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
ed40: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
ed50: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
ed60: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
ed70: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
ed80: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
ed90: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
eda0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
edb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
edc0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
edd0: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
ede0: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
edf0: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
ee00: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
ee10: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) 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 69 45  pPage);.      iE
ee40: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
ee50: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
ee60: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
ee70: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
ee80: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ee90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
eea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
eeb0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
eec0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
eed0: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
eee0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
eef0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
ef00: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
ef10: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
ef20: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
ef30: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
ef40: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
ef50: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
ef60: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
ef70: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
ef80: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
ef90: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
efa0: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
efb0: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
efc0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
efd0: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
efe0: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
eff0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
f000: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
f010: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
f020: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
f030: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
f040: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
f050: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
f060: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
f070: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
f080: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Page);.        n
f090: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
f0a0: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
f0b0: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
f0c0: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
f0d0: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
f0e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f0f0: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
f100: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
f110: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f120: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64  GE(pPage);.    d
f130: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
f140: 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67  rag;.  }.  x = g
f150: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
f160: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74  r+5]);.  if( iSt
f170: 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a  art<=x ){.    /*
f180: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
f190: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
f1a0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
f1b0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
f1c0: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
f1d0: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
f1e0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
f1f0: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
f200: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
f210: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
f220: 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c  .    if( iStart<
f230: 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31  x || iPtr!=hdr+1
f240: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f250: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
f260: 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  age);.    put2by
f270: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
f280: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
f290: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
f2a0: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
f2b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
f2c0: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
f2d0: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
f2e0: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
f2f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
f300: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
f310: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
f320: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
f330: 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
f340: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
f350: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
f360: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
f370: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
f380: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
f390: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
f3a0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
f3b0: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
f3c0: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  0, iSize);.  }. 
f3d0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f3e0: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
f3f0: 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  k);.  put2byte(&
f400: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
f410: 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  iSize);.  pPage-
f420: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
f430: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
f440: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f450: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
f460: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
f470: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
f480: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
f490: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
f4a0: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
f4b0: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
f4c0: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
f4d0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
f4e0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
f4f0: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
f500: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
f510: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
f520: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
f530: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
f540: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
f550: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
f560: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
f570: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
f580: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
f590: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f5a0: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
f5b0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f5c0: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
f5d0: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
f5e0: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
f5f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
f600: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
f610: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f620: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
f630: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
f640: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
f650: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
f660: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
f670: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
f680: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f690: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f6a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
f6b0: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
f6c0: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
f6d0: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
f6e0: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
f6f0: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
f700: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
f710: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
f720: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
f730: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f740: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
f750: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
f760: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
f770: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
f780: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
f790: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f7a0: 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35  E-OF: R-07291-35
f7b0: 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35  328 A value of 5
f7c0: 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68   (0x05) means th
f7d0: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
f7e0: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62   ** interior tab
f7f0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f800: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f810: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f820: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
f830: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f840: 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36  F: R-26900-09176
f850: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28   A value of 13 (
f860: 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0d) means the 
f870: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
f880: 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72   leaf table b-tr
f890: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f8a0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
f8b0: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
f8c0: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29  |PTF_LEAF)==13 )
f8d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f8e0: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Key = 1;.    if(
f8f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
f900: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f910: 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20  KeyLeaf = 1;.   
f920: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f930: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f940: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
f950: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
f960: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f970: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f980: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
f990: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
f9a0: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
f9b0: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
f9c0: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
f9d0: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
f9e0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f9f0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
fa00: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
fa10: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
fa20: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
fa30: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
fa40: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
fa50: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
fa60: 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76  -43316-37308 A v
fa70: 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29  alue of 2 (0x02)
fa80: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
fa90: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
faa0: 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  erior index b-tr
fab0: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
fac0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
fad0: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
fae0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
faf0: 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41   R-59615-42828 A
fb00: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78   value of 10 (0x
fb10: 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0a) means the pa
fb20: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
fb30: 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65  eaf index b-tree
fb40: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
fb50: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
fb60: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
fb70: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
fb80: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
fb90: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
fba0: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
fbb0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
fbc0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
fbd0: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
fbe0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
fbf0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
fc00: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
fc10: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
fc20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
fc30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fc40: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
fc50: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
fc60: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
fc70: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
fc80: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
fc90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fca0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
fcb0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
fcc0: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
fcd0: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
fce0: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
fcf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fd00: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
fd10: 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 73   amount of frees
fd20: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
fd30: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
fd40: 73 2c 20 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74 68  s, fill.** in th
fd50: 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 66  e pPage->nFree f
fd60: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
fd70: 69 6e 74 20 62 74 72 65 65 43 6f 6d 70 75 74 65  int btreeCompute
fd80: 46 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  FreeSpace(MemPag
fd90: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
fda0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
fdb0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
fdc0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
fdd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
fde0: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
fdf0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
fe00: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
fe10: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
fe20: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
fe30: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
fe40: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
fe50: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
fe60: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
fe70: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
fe80: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
fe90: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
fea0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
feb0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
fec0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
fed0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
fee0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
fef0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ff00: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ff10: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
ff20: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
ff30: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
ff40: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
ff50: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
ff60: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
ff70: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
ff80: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ff90: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
ffa0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ffb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ffc0: 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
ffd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ffe0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
fff0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
10010 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
10020 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
10030 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10050 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
10060 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
10070 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
10080 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
10090 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
100a0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
100b0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
100c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
100d0 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 61  isInit==1 );.  a
100e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
100f0 72 65 65 3c 30 20 29 3b 0a 0a 20 20 75 73 61 62  ree<0 );..  usab
10100 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
10110 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
10120 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
10130 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  hdrOffset;.  dat
10140 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
10150 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
10160 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
10170 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
10180 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
10190 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
101a0 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ** the start of 
101b0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
101c0 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61   area. A zero va
101d0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74  lue for this int
101e0 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74  eger is.  ** int
101f0 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33  erpreted as 6553
10200 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  6. */.  top = ge
10210 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
10220 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
10230 43 65 6c 6c 46 69 72 73 74 20 3d 20 68 64 72 20  CellFirst = hdr 
10240 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
10250 6c 64 50 74 72 53 69 7a 65 20 2b 20 32 2a 70 50  ldPtrSize + 2*pP
10260 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43  age->nCell;.  iC
10270 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
10280 53 69 7a 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a 20  Size - 4;..  /* 
10290 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
102a0 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
102b0 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56  the page.  ** EV
102c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
102d0 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
102e0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
102f0 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
10300 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f  the.  ** start o
10310 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
10320 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
10330 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
10340 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
10350 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a  ** freeblocks. *
10360 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
10370 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
10380 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
10390 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
103a0 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
103b0 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
103c0 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66  ee space */.  if
103d0 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33  ( pc>0 ){.    u3
103e0 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  2 next, size;.  
103f0 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
10400 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rst ){.      /* 
10410 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
10420 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20  5530-52930 In a 
10430 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
10440 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77  ee page, there w
10450 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77  ill.      ** alw
10460 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
10470 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
10480 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
10490 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
104a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
104b0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
104c0 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20  Page); .    }.  
104d0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
104e0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
104f0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
10500 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
10510 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10520 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
10530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10540 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10560 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
10570 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
10580 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
10590 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
105a0 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
105b0 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
105c0 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
105d0 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
105e0 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
105f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10600 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  ext>0 ){.      /
10610 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20  * Freeblock not 
10620 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
10630 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
10640 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10650 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10660 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b     }.    if( pc+
10670 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69  size>(unsigned i
10680 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  nt)usableSize ){
10690 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66  .      /* Last f
106a0 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73  reeblock extends
106b0 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a   past page end *
106c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
106d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
106e0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
106f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
10700 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
10710 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
10720 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
10730 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
10740 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10750 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
10760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
10770 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
10780 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
10790 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
107a0 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
107b0 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
107c0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ze.  ** of the p
107d0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
107e0 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
107f0 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
10800 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65   also.  ** serve
10810 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
10820 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10830 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10840 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a  cell-content.  *
10850 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
10860 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
10870 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
10880 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f  n the page..  */
10890 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61  .  if( nFree>usa
108a0 62 6c 65 53 69 7a 65 20 7c 7c 20 6e 46 72 65 65  bleSize || nFree
108b0 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
108c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
108d0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
108e0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  age);.  }.  pPag
108f0 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
10900 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
10910 72 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  rst);.  return S
10920 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10930 2a 2a 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  ** Do additional
10940 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 61 66   sanity check af
10950 74 65 72 20 62 74 72 65 65 49 6e 69 74 50 61 67  ter btreeInitPag
10960 65 28 29 20 69 66 0a 2a 2a 20 50 52 41 47 4d 41  e() if.** PRAGMA
10970 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
10980 3d 4f 4e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 53  =ON .*/.static S
10990 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
109a0 6e 74 20 62 74 72 65 65 43 65 6c 6c 53 69 7a 65  nt btreeCellSize
109b0 43 68 65 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  Check(MemPage *p
109c0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 43 65  Page){.  int iCe
109d0 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
109e0 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
109f0 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
10a00 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74   offset */.  int
10a10 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
10a20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
10a30 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
10a40 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
10a50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
10a60 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
10a70 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
10a80 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
10a90 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sz;            /
10aa0 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
10ab0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
10ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10ad0 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
10ae0 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
10af0 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  >aData[] */.  u8
10b00 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
10b10 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
10b20 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
10b30 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
10b40 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 73 61    /* Maximum usa
10b50 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ble space on the
10b60 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
10b70 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
10b80 20 53 74 61 72 74 20 6f 66 20 63 65 6c 6c 20 63   Start of cell c
10b90 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a  ontent area */..
10ba0 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 70    iCellFirst = p
10bb0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
10bc0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
10bd0 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  l;.  usableSize 
10be0 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
10bf0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
10c00 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
10c10 7a 65 20 2d 20 34 3b 0a 20 20 64 61 74 61 20 3d  ze - 4;.  data =
10c20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10c30 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
10c40 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
10c50 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
10c60 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
10c70 2d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  -;.  for(i=0; i<
10c80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
10c90 2b 29 7b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  +){.    pc = get
10ca0 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61  2byteAligned(&da
10cb0 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
10cc0 32 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  2]);.    testcas
10cd0 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
10ce0 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
10cf0 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
10d00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69   );.    if( pc<i
10d10 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
10d20 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
10d30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10d40 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10d50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
10d60 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
10d70 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
10d80 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 74 65 73  ta[pc]);.    tes
10d90 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
10da0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
10db0 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
10dc0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
10dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10de0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10e10 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
10e20 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
10e30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
10e40 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
10e50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10e60 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10e70 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
10e80 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
10e90 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
10ea0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
10eb0 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
10ec0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
10ed0 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
10ee0 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
10ef0 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
10f00 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
10f10 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
10f20 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
10f30 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
10f40 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
10f50 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
10f60 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
10f70 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
10f80 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
10f90 2a 70 50 61 67 65 29 7b 0a 20 20 75 38 20 2a 64  *pPage){.  u8 *d
10fa0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
10fb0 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
10fc0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68  >aData */.  BtSh
10fd0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
10fe0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
10ff0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
11000 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11010 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
11020 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
11030 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
11040 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11050 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11060 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11070 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11080 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
11090 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
110a0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
110b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
110c0 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
110d0 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
110e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
110f0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
11100 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
11110 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
11120 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11130 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
11140 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
11150 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
11160 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
11170 44 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 68 64  Data + pPage->hd
11180 72 4f 66 66 73 65 74 3b 0a 20 20 2f 2a 20 45 56  rOffset;.  /* EV
11190 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35  IDENCE-OF: R-285
111a0 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65  94-02890 The one
111b0 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66  -byte flag at of
111c0 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e  fset 0 indicatin
111d0 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65  g.  ** the b-tre
111e0 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
111f0 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
11200 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 30 5d  s(pPage, data[0]
11210 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11220 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11230 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
11240 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
11250 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11260 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
11270 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
11280 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
11290 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
112a0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
112b0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
112c0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
112d0 74 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  t = pPage->hdrOf
112e0 66 73 65 74 20 2b 20 38 20 2b 20 70 50 61 67 65  fset + 8 + pPage
112f0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
11300 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
11310 78 20 3d 20 64 61 74 61 20 2b 20 70 50 61 67 65  x = data + pPage
11320 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2b  ->childPtrSize +
11330 20 38 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61   8;.  pPage->aDa
11340 74 61 45 6e 64 20 3d 20 70 50 61 67 65 2d 3e 61  taEnd = pPage->a
11350 44 61 74 61 20 2b 20 70 42 74 2d 3e 75 73 61 62  Data + pBt->usab
11360 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d  leSize;.  pPage-
11370 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 70 50 61  >aDataOfst = pPa
11380 67 65 2d 3e 61 44 61 74 61 20 2b 20 70 50 61 67  ge->aData + pPag
11390 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
113a0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
113b0 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
113c0 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
113d0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
113e0 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  3 gives the.  **
113f0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
11400 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
11410 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
11420 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
11430 5b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  [3]);.  if( pPag
11440 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
11450 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
11460 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
11470 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
11480 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
11490 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
114a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
114b0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
114c0 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  ge);.  }.  testc
114d0 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
114e0 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
114f0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
11500 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
11510 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
11520 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
11530 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
11540 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
11550 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
11560 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
11570 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
11580 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73  en the.  ** offs
11590 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
115a0 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
115b0 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
115c0 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
115d0 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73   ** bytes of res
115e0 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a  erved space. */.
115f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11600 3e 6e 43 65 6c 6c 3e 30 0a 20 20 20 20 20 20 20  >nCell>0.       
11610 7c 7c 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  || get2byteNotZe
11620 72 6f 28 26 64 61 74 61 5b 35 5d 29 3d 3d 28 69  ro(&data[5])==(i
11630 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
11640 7a 65 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  ze.       || COR
11650 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 70 50 61  RUPT_DB );.  pPa
11660 67 65 2d 3e 6e 46 72 65 65 20 3d 20 2d 31 3b 20  ge->nFree = -1; 
11670 20 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61   /* Indicate tha
11680 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  t this value is 
11690 79 65 74 20 75 6e 63 6f 6d 70 75 74 65 64 20 2a  yet uncomputed *
116a0 2f 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  /.  pPage->isIni
116b0 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 42 74  t = 1;.  if( pBt
116c0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
116d0 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20  LITE_CellSizeCk 
116e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
116f0 72 65 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b  reeCellSizeCheck
11700 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
11710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
11730 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
11740 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
11750 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
11760 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
11770 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
11780 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
11790 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
117a0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
117b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
117c0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
117d0 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
117e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
117f0 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
11800 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
11810 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
11820 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11830 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
11840 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
11850 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
11860 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11870 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11880 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
11890 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
118a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
118b0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
118c0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
118d0 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
118e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
118f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
11900 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
11910 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11920 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11930 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
11940 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
11950 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29  TS_FAST_SECURE )
11960 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
11970 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
11980 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
11990 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
119a0 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
119b0 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
119c0 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
119d0 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
119e0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
119f0 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
11a00 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
11a10 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
11a20 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
11a30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
11a40 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
11a50 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
11a60 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
11a70 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
11a80 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
11a90 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
11aa0 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
11ab0 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
11ac0 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
11ad0 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
11ae0 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
11af0 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
11b00 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61  >aDataOfst = &da
11b10 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ta[pPage->childP
11b20 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  trSize];.  pPage
11b30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
11b40 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11b50 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
11b60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
11b70 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
11b80 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
11b90 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
11ba0 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
11bb0 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
11bc0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
11bd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
11be0 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
11bf0 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
11c00 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
11c10 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
11c20 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
11c30 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
11c40 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
11c50 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
11c60 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
11c70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
11c80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11c90 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
11ca0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11cb0 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
11cc0 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e  f( pgno!=pPage->
11cd0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
11ce0 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
11cf0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
11d00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61  DbPage);.    pPa
11d10 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
11d20 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65  bPage;.    pPage
11d30 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
11d40 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
11d50 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  gno;.    pPage->
11d60 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f  hdrOffset = pgno
11d70 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
11d80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
11d90 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  ge->aData==sqlit
11da0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
11db0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
11dc0 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
11dd0 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
11de0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
11df0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
11e00 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
11e10 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
11e20 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
11e30 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20  ded.  See also: 
11e40 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
11e50 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge()..**.** If t
11e60 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
11e70 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73  ONTENT flag is s
11e80 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
11e90 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
11ea0 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f  .** about the co
11eb0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
11ec0 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
11ed0 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
11ee0 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
11ef0 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
11f00 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
11f10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
11f20 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
11f30 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
11f40 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
11f50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
11f60 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
11f70 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
11f80 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
11f90 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
11fa0 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
11fb0 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
11fc0 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
11fd0 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
11fe0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
11ff0 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
12000 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
12010 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
12020 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
12030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12040 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
12050 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
12060 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
12070 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
12080 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
12090 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
120a0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
120b0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
120c0 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
120d0 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
120e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
120f0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
12100 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
12110 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
12120 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
12130 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
12140 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
12150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12160 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12170 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
12180 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
12190 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
121a0 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
121b0 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
121c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
121d0 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
121e0 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
121f0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
12200 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
12210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
12230 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
12240 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
12250 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
12260 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
12270 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
12280 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
12290 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
122a0 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
122b0 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
122c0 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
122d0 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
122e0 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
122f0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
12300 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
12310 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
12320 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
12330 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12340 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
12350 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
12360 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
12370 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
12380 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
12390 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
123a0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
123b0 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
123c0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
123d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
123e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
123f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12410 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
12420 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
12430 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
12440 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
12450 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
12460 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
12470 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
12480 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
12490 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
124a0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
124b0 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
124c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
124d0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
124e0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
124f0 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
12500 26 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20  &0x80000000)==0 
12510 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
12520 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
12530 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
12540 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
12550 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
12560 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
12570 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
12580 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
12590 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
125a0 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
125b0 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
125c0 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
125d0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
125e0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
125f0 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
12600 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
12610 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
12620 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
12630 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
12640 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
12650 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
12660 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
12670 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
12680 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
12690 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
126a0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
126b0 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
126c0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
126d0 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
126e0 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
126f0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
12700 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
12710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
12720 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
12730 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12760 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
12770 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
12780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12790 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
127a0 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
127b0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
127c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
127d0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
127e0 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
127f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
12820 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
12830 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
12840 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
12850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12860 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
12870 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
12880 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
12890 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
128a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
128b0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
128c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
128d0 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
128e0 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67  age==&pCur->pPag
128f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
12900 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f  Cur==0 || bReadO
12910 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61  nly==pCur->curPa
12920 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73  gerFlags );.  as
12930 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
12940 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
12950 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
12960 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
12970 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
12980 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12990 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  T;.    goto getA
129a0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
129b0 31 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  1;.  }.  rc = sq
129c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
129d0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
129e0 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
129f0 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b  age, bReadOnly);
12a00 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12a10 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
12a20 50 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d  Page_error1;.  }
12a30 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65  .  *ppPage = (Me
12a40 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
12a50 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
12a60 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  age);.  if( (*pp
12a70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
12a80 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67   ){.    btreePag
12a90 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12aa0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12ab0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
12ac0 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
12ad0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12af0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
12b00 50 61 67 65 5f 65 72 72 6f 72 32 3b 0a 20 20 20  Page_error2;.   
12b10 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
12b20 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
12b30 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
12b40 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
12b50 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
12b60 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
12b70 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
12b80 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
12b90 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
12ba0 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
12bb0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
12bc0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
12bd0 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
12be0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
12bf0 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
12c00 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
12c10 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
12c20 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
12c30 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
12c40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12c50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 67  GNO(pgno);.    g
12c60 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12c70 67 65 5f 65 72 72 6f 72 32 3b 0a 20 20 7d 0a 20  ge_error2;.  }. 
12c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12c90 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
12ca0 67 65 5f 65 72 72 6f 72 32 3a 0a 20 20 72 65 6c  ge_error2:.  rel
12cb0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
12cc0 29 3b 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67  );.getAndInitPag
12cd0 65 5f 65 72 72 6f 72 31 3a 0a 20 20 69 66 28 20  e_error1:.  if( 
12ce0 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72  pCur ){.    pCur
12cf0 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70  ->iPage--;.    p
12d00 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
12d10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
12d20 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65  iPage];.  }.  te
12d30 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20  stcase( pgno==0 
12d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
12d50 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  o!=0 || rc==SQLI
12d60 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20  TE_CORRUPT );.  
12d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12d80 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
12d90 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
12da0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
12db0 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
12dc0 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
12dd0 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  eeGetPage..**.**
12de0 20 50 61 67 65 31 20 69 73 20 61 20 73 70 65 63   Page1 is a spec
12df0 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73  ial case and mus
12e00 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 73  t be released us
12e10 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f  ing releasePageO
12e20 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ne()..*/.static 
12e30 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12e40 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20  NotNull(MemPage 
12e50 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  *pPage){.  asser
12e60 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
12e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12e80 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
12e90 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
12ea0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
12eb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12ec0 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
12ed0 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
12ee0 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
12ef0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12f00 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
12f10 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
12f20 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
12f30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12f40 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
12f50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12f60 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
12f70 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
12f80 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74  pDbPage);.}.stat
12f90 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
12fa0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
12fb0 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
12fc0 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f   ) releasePageNo
12fd0 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a  tNull(pPage);.}.
12fe0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
12ff0 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61  asePageOne(MemPa
13000 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
13010 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
13020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13030 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
13040 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
13050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13060 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
13070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13080 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
13090 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
130a0 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
130b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
130c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
130d0 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
130e0 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
130f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13110 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
13120 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
13130 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e  PagerUnrefPageOn
13140 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
13150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
13160 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a  an unused page..
13170 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
13180 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65   just like btree
13190 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74  GetPage() with t
131a0 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a  he addition:.**.
131b0 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70  **   *  If the p
131c0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
131d0 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  n use for some o
131e0 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d  ther purpose, im
131f0 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20  mediately.**    
13200 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64    release it and
13210 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
13220 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CURRUPT error.
13230 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75  .**   *  Make su
13240 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c  re the isInit fl
13250 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73  ag is clear.*/.s
13260 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
13270 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20  etUnusedPage(.  
13280 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
13290 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
132a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
132b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
132c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
132d0 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
132e0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
132f0 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
13300 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
13310 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
13320 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
13330 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
13340 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
13350 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
13360 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
13370 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
13380 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
13390 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
133a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
133b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
133c0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
133d0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
133e0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
133f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
13400 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
13410 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
13420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13430 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
13440 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
13450 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
13460 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
13470 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
13480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13490 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
134a0 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
134b0 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
134c0 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
134d0 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
134e0 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
134f0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
13500 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
13510 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
13520 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13530 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
13540 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
13550 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
13560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13570 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
13580 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
13590 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
135a0 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
135b0 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
135c0 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
135d0 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
135e0 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
135f0 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
13600 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
13610 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
13620 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
13630 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
13640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13650 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
13660 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
13670 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
13680 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
13690 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
136a0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
136b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
136c0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
136d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
136e0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
136f0 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
13700 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
13710 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
13720 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
13730 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
13740 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
13750 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
13760 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
13770 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
13780 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
13790 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
137a0 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
137b0 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
137c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
137d0 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
137e0 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
137f0 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
13800 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
13810 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
13820 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
13830 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
13840 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
13850 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
13860 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
13870 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
13880 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
13890 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
138a0 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
138b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
138c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
138d0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
138e0 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
138f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13900 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
13910 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
13920 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
13930 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
13940 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
13950 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
13960 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13970 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
13980 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
13990 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
139a0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
139b0 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
139c0 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ler,.           
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
139f0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
13a00 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ger));.}../*.** 
13a10 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
13a20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
13a30 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
13a40 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
13a50 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
13a60 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
13a70 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
13a80 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
13a90 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
13aa0 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13ab0 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
13ac0 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
13ad0 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
13ae0 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
13af0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
13b00 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
13b10 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13b20 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
13b30 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
13b40 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
13b50 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
13b60 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
13b70 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
13b80 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
13b90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13ba0 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
13bb0 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
13bc0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
13bd0 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
13be0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
13bf0 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
13c00 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
13c10 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
13c20 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
13c30 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
13c40 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
13c50 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
13c60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
13c70 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
13c80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
13c90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13ca0 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
13cb0 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
13cc0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
13cd0 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
13ce0 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
13cf0 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
13d00 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
13d10 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
13d20 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
13d30 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
13d40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13d50 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
13d60 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
13d70 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
13d80 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
13d90 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
13da0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13db0 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
13dc0 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
13dd0 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
13de0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
13df0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
13e00 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
13e10 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
13e20 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
13e30 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
13e40 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
13e50 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
13e60 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
13e70 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
13e80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
13e90 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
13ea0 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
13eb0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
13ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
13ed0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
13ee0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
13ef0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
13f00 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
13f10 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
13f20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
13f30 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
13f40 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
13f50 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
13f60 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
13f70 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f90 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
13fa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
13fb0 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
13fc0 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
13fd0 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
13fe0 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
13ff0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
14000 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
14010 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
14020 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
14030 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
14040 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
14050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
14060 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
14070 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
14080 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
14090 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
140a0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
140b0 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
140c0 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
140d0 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
140e0 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
140f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
14100 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
14110 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
14120 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
14130 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
14140 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
14150 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
14160 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
14170 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
14180 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
14190 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
141a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
141b0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
141c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
141d0 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
141e0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
141f0 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
14200 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
14210 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
14220 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
14230 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
14240 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
14250 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
14260 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
14270 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
14280 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
14290 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
142a0 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
142b0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
142c0 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
142d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
142e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
142f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
14300 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
14310 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
14320 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
14330 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
14340 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
14350 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
14360 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
14370 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
14380 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
14390 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
143a0 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
143b0 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
143c0 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
143d0 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
143e0 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
143f0 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
14400 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
14410 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
14420 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
14430 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
14440 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
14450 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
14460 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
14470 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
14480 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
14490 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
144a0 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
144b0 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
144c0 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
144d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
144e0 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
144f0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
14500 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
14510 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
14520 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
14530 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14540 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
14550 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
14560 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14570 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
14580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14590 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
145a0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
145b0 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
145c0 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
145d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
145e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
145f0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
14600 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14610 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
14620 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
14630 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
14640 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
14650 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
14660 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
14670 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
14680 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
14690 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
146a0 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
146b0 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
146c0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
146d0 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
146e0 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
146f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
14700 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
14710 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
14720 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
14730 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
14740 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
14750 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
14760 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
14770 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
14780 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
14790 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
147a0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
147b0 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
147c0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
147d0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
147e0 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
147f0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
14800 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
14810 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
14820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14830 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
14840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
14850 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
14860 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d  .      if( isMem
14870 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  db ){.        me
14880 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61  mcpy(zFullPathna
14890 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  me, zFilename, n
148a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
148b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
148c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
148d0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
148e0 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
14910 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
14920 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
14930 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14940 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14950 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14960 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
14970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
14980 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
14990 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
149a0 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
149b0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
149c0 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
149d0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
149e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
149f0 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
14a00 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14a10 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
14a20 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
14a30 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
14a40 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14a50 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
14a60 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
14a70 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14a80 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23  (mutexShared);.#
14a90 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
14aa0 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
14ab0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
14ac0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
14ad0 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
14ae0 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
14af0 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
14b00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
14b10 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
14b20 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
14b30 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
14b40 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20  ->pPager, 0)).  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
14b60 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
14b70 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
14b80 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
14b90 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
14ba0 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
14bb0 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
14bc0 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
14bd0 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
14be0 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
14bf0 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
14c00 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
14c10 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
14c20 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
14c30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14c40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14c50 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14c60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14c70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14c80 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
14c90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14ca0 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
14cb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
14cc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14cd0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
14ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14cf0 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
14d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14d20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
14d30 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
14d40 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
14d50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
14d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
14d70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14d80 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14da0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
14db0 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
14dc0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14dd0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
14de0 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
14df0 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
14e00 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
14e10 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
14e20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
14e30 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
14e40 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
14e50 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
14e60 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
14e70 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
14e80 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
14e90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14ea0 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
14eb0 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
14ec0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
14ed0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
14ee0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
14ef0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
14f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
14f10 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
14f20 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
14f30 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
14f40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
14f50 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
14f60 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
14f70 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
14f80 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
14f90 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
14fa0 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
14fb0 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
14fc0 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
14fd0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
14fe0 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
14ff0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
15000 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b  izeof(i64)==8 );
15010 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15020 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(u64)==8 );. 
15030 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15040 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
15050 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15060 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
15070 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
15080 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
15090 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
150a0 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
150b0 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
150c0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
150d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
150e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
150f0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
15100 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
15110 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15120 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
15130 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
15140 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
15160 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66  zeof(MemPage), f
15170 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
15180 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
15190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
151a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
151b0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
151c0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
151d0 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20  , db->szMmap);. 
151e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
151f0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
15200 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
15210 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
15220 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
15230 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
15240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15250 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
15260 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
15270 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67     pBt->openFlag
15280 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20  s = (u8)flags;. 
15290 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b     pBt->db = db;
152a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
152b0 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28  rSetBusyHandler(
152c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
152d0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
152e0 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
152f0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
15300 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
15310 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
15320 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69  Page1 = 0;.    i
15330 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  f( sqlite3PagerI
15340 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
15350 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74  Pager) ) pBt->bt
15360 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
15370 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66  AD_ONLY;.#if def
15380 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55  ined(SQLITE_SECU
15390 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70  RE_DELETE).    p
153a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
153b0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
153c0 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  E;.#elif defined
153d0 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43  (SQLITE_FAST_SEC
153e0 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
153f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15400 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a   BTS_OVERWRITE;.
15410 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
15420 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
15430 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
15440 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
15450 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
15460 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
15470 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
15480 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
15490 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
154a0 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
154b0 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
154c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
154d0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
154e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
154f0 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
15500 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
15510 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
15520 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
15530 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
15540 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
15550 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
15560 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
15570 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
15580 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
15590 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
155a0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
155b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
155c0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
155d0 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
155e0 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
155f0 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
15600 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
15610 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
15620 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
15630 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
15640 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
15650 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
15660 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15670 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
15680 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
15690 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
156a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
156b0 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
156c0 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
156d0 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
156e0 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
156f0 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
15700 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
15710 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
15720 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
15730 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
15740 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
15750 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
15760 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
15770 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
15780 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
15790 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
157a0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
157b0 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
157c0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
157d0 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
157e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
157f0 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
15800 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
15810 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
15820 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
15830 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
15840 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
15850 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
15860 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
15870 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
15880 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
15890 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
158a0 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
158b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
158c0 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
158d0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
158e0 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
158f0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
15900 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
15910 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
15920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15930 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
15940 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
15950 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
15960 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
15970 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
15980 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
15990 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
159a0 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
159b0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
159c0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
159d0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
159e0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
159f0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
15a00 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
15a10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
15a20 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15a30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
15a40 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
15a50 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
15a60 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
15a70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
15a80 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
15a90 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
15aa0 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
15ab0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15ac0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15ad0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
15ae0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
15af0 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
15b00 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
15b10 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
15b20 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
15b30 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
15b40 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  */.    pBt->nRef
15b50 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 1;.    if( p-
15b60 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
15b70 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
15b80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
15b90 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
15ba0 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
15bb0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
15bc0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
15bd0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
15be0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
15bf0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
15c00 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
15c10 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15c20 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
15c30 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
15c40 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
15c50 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15c60 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
15c70 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
15c80 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
15c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15ca0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
15cb0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
15cc0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
15cd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15ce0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15cf0 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
15d00 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
15d10 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
15d20 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
15d30 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
15d40 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
15d50 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
15d60 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
15d70 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
15d80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15d90 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
15da0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
15db0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
15dc0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15dd0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
15de0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
15df0 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
15e00 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
15e10 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
15e20 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
15e30 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
15e40 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
15e50 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
15e60 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
15e70 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
15e80 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
15e90 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
15ea0 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
15eb0 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
15ec0 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
15ed0 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
15ee0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
15ef0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
15f00 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
15f10 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
15f20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
15f30 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
15f40 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
15f50 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
15f60 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
15f70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
15f80 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29        if( (uptr)
15f90 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69  p->pBt<(uptr)pSi
15fa0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
15fb0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
15fc0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
15fd0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
15fe0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
15ff0 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
16000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16010 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
16020 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69  ext && (uptr)pSi
16030 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75  b->pNext->pBt<(u
16040 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20  ptr)p->pBt ){.  
16050 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
16060 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
16070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16080 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
16090 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
160a0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
160b0 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
160c0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
160d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
160e0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
160f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16100 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
16110 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
16120 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
16130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16140 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
16150 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
16160 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
16170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16180 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
16190 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
161a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
161b0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
161c0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
161d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
161e0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
161f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
16200 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
16210 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
16220 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a  e3_file *pFile;.
16230 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
16240 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
16250 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
16260 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
16270 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
16280 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
16290 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
162a0 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
162b0 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
162c0 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
162d0 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
162e0 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
162f0 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
16300 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
16310 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
16320 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
16330 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
16340 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
16350 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
16360 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
16370 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  E);.    }..    p
16380 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
16390 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
163a0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ger);.    if( pF
163b0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  ile->pMethods ){
163c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
163d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
163e0 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43  pFile, SQLITE_FC
163f0 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29  NTL_PDB, (void*)
16400 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  &pBt->db);.    }
16410 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
16420 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
16430 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16440 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
16450 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
16460 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
16470 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  exOpen);.  }.  a
16480 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
16490 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42  E_OK || sqlite3B
164a0 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f  treeConnectionCo
164b0 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20  unt(*ppBtree)>0 
164c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
164d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
164e0 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
164f0 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
16500 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
16510 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
16520 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
16530 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
16540 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
16550 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
16560 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
16570 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
16580 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
16590 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
165a0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
165b0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
165c0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
165d0 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
165e0 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
165f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16600 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
16610 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
16620 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
16630 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
16640 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
16650 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
16660 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16670 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
16680 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
16690 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
166a0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
166b0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
166c0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
166d0 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
166e0 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
166f0 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
16700 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
16710 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
16720 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
16730 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
16740 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
16750 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
16760 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
16770 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
16780 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
16790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
167a0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
167b0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
167c0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
167d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
167e0 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
167f0 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
16800 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
16810 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
16820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16830 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
16840 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
16850 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
16860 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
16870 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
16880 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
16890 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
168a0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
168b0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
168c0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
168d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
168e0 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
168f0 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
16900 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
16910 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
16920 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
16930 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
16940 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
16950 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
16960 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
16970 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
16980 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
16990 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
169a0 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
169b0 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
169c0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
169d0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
169e0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
169f0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
16a00 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
16a10 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
16a20 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
16a30 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
16a40 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
16a50 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
16a60 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
16a70 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
16a80 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
16a90 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
16aa0 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
16ab0 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
16ac0 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
16ad0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
16ae0 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
16af0 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
16b00 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
16b10 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
16b20 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
16b30 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
16b40 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
16b50 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
16b60 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
16b70 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
16b80 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
16b90 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
16ba0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
16bb0 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
16bc0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
16bd0 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
16be0 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
16bf0 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
16c00 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
16c10 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
16c20 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
16c30 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
16c40 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
16c50 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
16c60 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
16c70 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
16c80 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
16c90 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
16ca0 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
16cb0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
16cc0 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
16cd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
16ce0 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
16cf0 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
16d00 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
16d10 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
16d20 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
16d30 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
16d40 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
16d50 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
16d60 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
16d70 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
16d80 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
16d90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
16da0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
16db0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
16dc0 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
16dd0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
16de0 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
16df0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
16e00 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
16e10 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
16e20 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
16e30 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
16e40 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
16e50 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
16e60 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
16e70 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
16e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
16e90 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
16ea0 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
16eb0 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
16ec0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
16ed0 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
16ee0 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
16ef0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
16f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16f10 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
16f20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16f30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
16f40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
16f50 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
16f60 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
16f70 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
16f80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
16f90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16fa0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16fb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16fc0 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
16fd0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
16fe0 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
16ff0 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
17000 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
17010 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
17020 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
17030 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
17040 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17050 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
17060 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
17070 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
17080 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
17090 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
170a0 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
170b0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
170c0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
170d0 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
170e0 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
170f0 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
17100 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
17110 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
17120 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
17130 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
17140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17150 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
17160 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
17170 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
17180 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
17190 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
171a0 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
171b0 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
171c0 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
171d0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
171e0 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
171f0 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
17200 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
17210 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
17220 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
17230 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
17240 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
17250 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
17260 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
17270 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
17280 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
17290 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
172a0 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
172b0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
172c0 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
172d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
172e0 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
172f0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
17300 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
17310 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
17320 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
17330 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
17340 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
17350 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  db);.    if( pBt
17360 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
17370 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
17380 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
17390 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
173a0 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
173b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
173c0 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
173d0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
173e0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
173f0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
17400 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
17410 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
17420 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
17430 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
17440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17450 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
17460 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
17470 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
17480 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
17490 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
174a0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
174b0 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
174c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
174d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
174e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
174f0 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74  Change the "soft
17500 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
17510 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17520 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
17530 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64  Unused and unmod
17540 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c  ified pages will
17550 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65   be recycled whe
17560 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
17570 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
17580 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68  cache exceeds th
17590 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20  is soft limit.  
175a0 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  But the size of 
175b0 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20  the.** cache is 
175c0 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20  allowed to grow 
175d0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
175e0 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e   limit if it con
175f0 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70  tains.** dirty p
17600 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74  ages or pages st
17610 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73  ill in active us
17620 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17630 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
17640 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
17650 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
17660 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17670 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
17680 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17690 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
176a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
176b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
176c0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
176d0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
176e0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
176f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17700 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17710 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17720 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c  Change the "spil
17730 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  l" limit on the 
17740 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
17750 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
17760 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
17770 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20  f pages exceeds 
17780 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e  this limit durin
17790 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
177a0 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61  ction,.** the pa
177b0 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ger might attemp
177c0 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67  t to "spill" pag
177d0 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
177e0 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72  l early in.** or
177f0 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
17800 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
17810 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
17820 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  is the current s
17830 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a  pill size.  If z
17840 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a  ero is passed.**
17850 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   as an argument,
17860 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
17870 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c  made to the spil
17880 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20  l size setting, 
17890 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61  so.** using mxPa
178a0 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79  ge of 0 is a way
178b0 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
178c0 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
178d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
178e0 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
178f0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17900 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
17910 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17920 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  t;.  int res;.  
17930 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17940 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
17950 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
17960 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17970 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  p);.  res = sqli
17980 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
17990 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
179a0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
179b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
179c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
179d0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
179e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
179f0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17a00 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
17a10 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
17a20 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
17a30 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
17a40 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
17a50 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
17a60 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
17a70 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
17a80 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
17a90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17ab0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17ac0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17ae0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
17af0 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
17b00 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
17b10 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
17b20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17b30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17b40 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
17b50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17b60 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
17b70 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
17b80 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
17b90 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
17ba0 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
17bb0 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
17bc0 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
17bd0 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
17be0 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
17bf0 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
17c00 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
17c10 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
17c20 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
17c30 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
17c40 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
17c50 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
17c60 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
17c70 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
17c80 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
17c90 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
17ca0 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
17cb0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17cc0 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
17cd0 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
17ce0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17cf0 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
17d00 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
17d10 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
17d20 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
17d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
17d40 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
17d50 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
17d60 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
17d70 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
17d80 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
17d90 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
17da0 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
17db0 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
17dc0 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
17dd0 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
17de0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
17df0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17e00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17e10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17e20 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
17e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17e40 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
17e50 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
17e60 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
17e70 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
17e80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17e90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17ea0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17eb0 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
17ec0 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
17ed0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
17ee0 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
17ef0 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
17f00 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
17f10 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
17f20 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
17f30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17f40 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
17f50 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
17f60 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
17f70 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
17f80 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
17f90 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
17fa0 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
17fb0 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
17fc0 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
17fd0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
17fe0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
17ff0 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
18000 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
18010 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
18020 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
18030 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
18040 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
18050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18060 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
18070 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
18080 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
18090 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
180a0 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
180b0 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
180c0 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
180d0 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
180e0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
180f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
18100 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
18110 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
18120 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
18130 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
18140 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
18150 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
18160 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
18170 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
18180 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
18190 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
181a0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
181b0 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
181c0 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
181d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
181e0 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
181f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
18200 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
18210 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
18220 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
18230 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
18240 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
18250 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18260 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
18270 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
18280 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
18290 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
182a0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
182b0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
182c0 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
182d0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
182e0 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
182f0 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
18300 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
18310 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
18320 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
18330 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
18340 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18350 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
18360 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
18370 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
18380 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
18390 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
183a0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
183b0 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
183c0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
183d0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
183e0 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
183f0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
18400 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
18410 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
18420 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
18430 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
18440 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
18450 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
18460 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
18470 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
18480 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
18490 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
184a0 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
184b0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
184c0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
184d0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
184e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
184f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
18500 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
18510 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
18520 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
18530 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
18540 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
18550 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
18560 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
18570 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18580 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18590 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
185a0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
185b0 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
185c0 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
185d0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
185e0 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
185f0 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
18600 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
18610 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18620 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
18630 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
18640 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
18650 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
18660 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
18670 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
18680 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
18690 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
186a0 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
186b0 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
186c0 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
186d0 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
186e0 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
186f0 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
18700 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
18710 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
18720 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
18730 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
18740 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
18750 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
18760 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
18770 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
18780 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
18790 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
187a0 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
187b0 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
187c0 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
187d0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
187e0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
187f0 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
18800 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
18810 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18820 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
18830 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
18840 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
18850 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18860 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
18870 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
18880 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
18890 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
188a0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
188b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
188c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
188d0 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
188e0 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
188f0 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
18900 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
18910 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
18920 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
18930 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
18940 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
18950 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
18960 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
18970 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
18980 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
18990 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
189a0 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
189b0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
189c0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
189d0 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
189e0 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
189f0 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
18a00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18a10 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
18a20 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
18a30 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
18a40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
18a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18a60 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
18a70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
18a80 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
18a90 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
18aa0 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
18ab0 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
18ac0 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
18ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18ae0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18af0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
18b00 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
18b10 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
18b20 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
18b30 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
18b40 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
18b50 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
18b60 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
18b70 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
18b80 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
18b90 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
18ba0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
18bb0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
18bc0 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
18bd0 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
18be0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
18bf0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
18c00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18c10 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
18c20 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
18c30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
18c40 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
18c50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18c60 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
18c70 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
18c80 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54 53  lues for the BTS
18c90 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61  _SECURE_DELETE a
18ca0 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
18cb0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
18cc0 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20   newFlag==0     
18cd0 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52    Both BTS_SECUR
18ce0 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53  E_DELETE and BTS
18cf0 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20 63  _OVERWRITE are c
18d00 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77  leared.**    new
18d10 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54  Flag==1       BT
18d20 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
18d30 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  set and BTS_OVER
18d40 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65 64  WRITE is cleared
18d50 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
18d60 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55  2       BTS_SECU
18d70 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65  RE_DELETE cleare
18d80 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  d and BTS_OVERWR
18d90 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  ITE is set.**   
18da0 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20   newFlag==(-1)  
18db0 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a    No changes.**.
18dc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18dd0 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79 20  acts as a query 
18de0 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65  if newFlag is le
18df0 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a  ss than zero.**.
18e00 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52  ** With BTS_OVER
18e10 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74  WRITE set, delet
18e20 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76  ed content is ov
18e30 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72  erwritten by zer
18e40 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c  os, but.** freel
18e50 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61  ist leaf pages a
18e60 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62  re not written b
18e70 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
18e80 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61  ase.  Thus in-pa
18e90 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f  ge.** deleted co
18ea0 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64  ntent is cleared
18eb0 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20 64  , but freelist d
18ec0 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18ed0 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  s not..**.** Wit
18ee0 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  h BTS_SECURE_DEL
18ef0 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69  ETE, operation i
18f00 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57  s like BTS_OVERW
18f10 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61 64  RITE with the ad
18f20 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66  dition.** that f
18f30 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
18f40 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 62  es are written b
18f50 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
18f60 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e  abase, increasin
18f70 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20  g.** the amount 
18f80 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a  of disk I/O..*/.
18f90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18fa0 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
18fb0 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
18fc0 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
18fd0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
18fe0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
18ff0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
19000 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57  ssert( BTS_OVERW
19010 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45  RITE==BTS_SECURE
19020 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61  _DELETE*2 );.  a
19030 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f  ssert( BTS_FAST_
19040 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45  SECURE==(BTS_OVE
19050 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52  RWRITE|BTS_SECUR
19060 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69  E_DELETE) );.  i
19070 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
19080 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
19090 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41  Flags &= ~BTS_FA
190a0 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70  ST_SECURE;.    p
190b0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
190c0 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
190d0 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20  LETE*newFlag;.  
190e0 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d  }.  b = (p->pBt-
190f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
19100 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53  FAST_SECURE)/BTS
19110 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
19120 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19130 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19140 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
19150 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
19160 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
19170 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
19180 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
19190 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
191a0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
191b0 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
191c0 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
191d0 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
191e0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
191f0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
19200 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
19210 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
19220 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
19230 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
19240 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
19250 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
19260 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
19270 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
19280 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
19290 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
192a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
192b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
192c0 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
192d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
192e0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
192f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19300 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
19310 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
19320 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19330 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
19340 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
19350 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
19360 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
19370 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
19380 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19390 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
193a0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
193b0 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
193c0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
193d0 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
193e0 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
193f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19400 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
19410 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
19420 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
19430 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
19440 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
19450 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
19460 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
19470 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19480 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
19490 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
194a0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
194b0 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
194c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
194d0 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
194e0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
194f0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
19500 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19510 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
19520 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
19530 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
19540 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
19550 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
19560 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
19570 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
19580 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
19590 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
195a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
195b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
195c0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
195d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
195e0 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74  user has not set
195f0 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
19600 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  l for this datab
19610 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
19620 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  * using "PRAGMA 
19630 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e  synchronous", an
19640 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79 2d  d if the safety-
19650 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72  level is not alr
19660 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74  eady.** set to t
19670 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
19680 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
19690 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
196a0 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74  arameter,.** set
196b0 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53   it so..*/.#if S
196c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
196d0 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54  NCHRONOUS!=SQLIT
196e0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
196f0 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20  NCHRONOUS \.    
19700 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19710 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61  TE_OMIT_WAL).sta
19720 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66 61  tic void setDefa
19730 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68  ultSyncFlag(BtSh
19740 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61  ared *pBt, u8 sa
19750 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73  fety_level){.  s
19760 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
19770 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62   *pDb;.  if( (db
19780 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20  =pBt->db)!=0 && 
19790 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30  (pDb=db->aDb)!=0
197a0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
197b0 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44  Db->pBt==0 || pD
197c0 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74  b->pBt->pBt!=pBt
197d0 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20   ){ pDb++; }.   
197e0 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53   if( pDb->bSyncS
197f0 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  et==0 .     && p
19800 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
19810 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a  !=safety_level .
19820 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64 62       && pDb!=&db
19830 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b  ->aDb[1] .    ){
19840 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65  .      pDb->safe
19850 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74  ty_level = safet
19860 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73  y_level;.      s
19870 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
19880 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
19890 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
198a0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28  safety_level | (
198b0 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45  db->flags & PAGE
198c0 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a  R_FLAGS_MASK));.
198d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
198e0 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44 65  e.# define setDe
198f0 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
19900 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a  t,safety_level).
19910 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
19920 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
19930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
19940 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
19950 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  d*);.../*.** Get
19960 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
19970 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
19980 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
19990 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
199a0 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
199b0 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
199c0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
199d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
199e0 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
199f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
19a00 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
19a10 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
19a20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19a30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
19a40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
19a50 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
19a60 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
19a70 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
19a80 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
19a90 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
19aa0 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
19ab0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
19ac0 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
19ad0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19af0 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
19b00 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
19b10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
19b20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
19b30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19b40 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ile */.  u32 nPa
19b50 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
19b60 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
19b70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
19b80 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 46   */.  u32 nPageF
19b90 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
19ba0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19bc0 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67  le */.  u32 nPag
19bd0 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
19be0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19bf0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19c00 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
19c10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
19c20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19c30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19c40 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19c50 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
19c60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19c70 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
19c80 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
19c90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
19ca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
19cb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
19cc0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
19cd0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19ce0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
19cf0 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
19d00 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
19d10 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
19d20 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
19d30 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
19d40 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
19d50 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
19d60 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
19d70 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
19d80 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
19d90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
19da0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
19db0 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e 50  Pager, (int*)&nP
19dc0 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
19dd0 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
19de0 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
19df0 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
19e00 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
19e10 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
19e20 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
19e30 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e    }.  if( (pBt->
19e40 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19e50 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
19e60 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
19e70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
19e80 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
19e90 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
19ea0 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
19eb0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
19ec0 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
19ed0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19ee0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
19ef0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
19f00 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
19f10 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
19f20 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
19f30 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
19f40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
19f50 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
19f60 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
19f70 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
19f80 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
19f90 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
19fa0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
19fb0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
19fc0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
19fd0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19fe0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
19ff0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1a000 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
1a010 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
1a020 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a030 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1a040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a050 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
1a060 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a070 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a080 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
1a090 20 70 61 67 65 31 5b 31 38 5d 3e 33 20 29 7b 0a   page1[18]>3 ){.
1a0a0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1a0b0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
1a0c0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
1a0d0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 33 20  if( page1[19]>3 
1a0e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1a0f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1a100 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1a110 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
1a120 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
1a130 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
1a140 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
1a150 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
1a160 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
1a170 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1a180 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
1a190 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
1a1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a1b0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
1a1c0 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
1a1d0 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
1a1e0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
1a1f0 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
1a200 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
1a210 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
1a220 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
1a230 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
1a240 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
1a250 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
1a260 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
1a270 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
1a280 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
1a290 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
1a2a0 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
1a2b0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
1a2c0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1a2d0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 3d 32  if( page1[19]>=2
1a2e0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1a2f0 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
1a300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1a310 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
1a320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a330 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
1a340 3e 70 50 61 67 65 72 2c 20 28 70 61 67 65 31 5b  >pPager, (page1[
1a350 31 39 5d 3d 3d 33 29 2c 20 26 69 73 4f 70 65 6e  19]==3), &isOpen
1a360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a380 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a390 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a3a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a3b0 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
1a3c0 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
1a3d0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
1a3e0 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20  NCHRONOUS+1);.  
1a3f0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
1a400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a410 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1a420 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
1a430 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a440 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
1a450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1a460 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
1a470 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a480 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
1a490 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
1a4a0 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
1a4b0 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23  NOUS+1);.    }.#
1a4c0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
1a4d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
1a4e0 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
1a4f0 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
1a500 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
1a510 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
1a520 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
1a530 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
1a540 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1a550 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
1a560 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1a570 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
1a580 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
1a590 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
1a5a0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
1a5b0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
1a5c0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
1a5d0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
1a5e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
1a5f0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
1a600 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
1a610 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
1a620 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a630 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1a640 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a650 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
1a660 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
1a670 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a680 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
1a690 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
1a6a0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
1a6b0 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
1a6c0 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
1a6d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
1a6e0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
1a6f0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1a700 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
1a710 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
1a720 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
1a730 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a740 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
1a750 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
1a760 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
1a770 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
1a780 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
1a790 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
1a7a0 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
1a7b0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
1a7c0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
1a7d0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
1a7e0 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
1a7f0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
1a800 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
1a810 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1a820 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1a830 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a840 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
1a850 46 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65 72  FIXED;.    asser
1a860 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
1a870 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
1a880 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
1a890 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
1a8a0 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
1a8b0 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
1a8c0 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
1a8d0 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
1a8e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1a8f0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
1a900 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
1a910 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
1a920 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
1a930 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
1a940 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1a950 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
1a960 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
1a970 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
1a980 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
1a990 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
1a9a0 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
1a9b0 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
1a9c0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
1a9d0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1a9e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1a9f0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
1aa00 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
1aa10 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
1aa20 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
1aa30 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
1aa40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
1aa50 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
1aa60 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1aa70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1aa80 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
1aa90 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
1aaa0 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
1aab0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
1aac0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
1aad0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
1aae0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
1aaf0 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
1ab00 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
1ab10 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
1ab20 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
1ab30 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1ab40 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
1ab50 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
1ab60 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
1ab70 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
1ab80 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
1ab90 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
1aba0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1abb0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
1abc0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1abd0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
1abe0 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
1abf0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1ac00 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
1ac10 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
1ac20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ac30 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
1ac40 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
1ac50 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1ac80 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
1ac90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1aca0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1acb0 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
1acc0 53 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d  Schema(pBt->db)=
1acd0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
1ace0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
1acf0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1ad00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1ad10 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1ad20 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1ad30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1ad40 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
1ad50 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
1ad60 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
1ad70 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
1ad80 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
1ad90 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
1ada0 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
1adb0 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
1adc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
1add0 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
1ade0 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
1adf0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
1ae00 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
1ae10 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1ae20 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1ae30 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
1ae40 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1ae50 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
1ae60 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1ae70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1ae80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ae90 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
1aea0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1aeb0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
1aec0 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
1aed0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
1aee0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1aef0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
1af00 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1af10 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
1af20 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1af30 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
1af40 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
1af50 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
1af60 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
1af70 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
1af80 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
1af90 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
1afa0 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
1afb0 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
1afc0 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
1afd0 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
1afe0 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
1aff0 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
1b000 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
1b010 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
1b020 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
1b030 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
1b040 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
1b050 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
1b060 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
1b070 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
1b080 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1b090 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
1b0a0 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
1b0b0 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
1b0c0 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
1b0d0 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
1b0e0 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
1b0f0 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
1b100 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
1b110 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
1b120 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
1b130 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
1b140 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
1b150 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
1b160 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
1b170 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1b180 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
1b190 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
1b1a0 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
1b1b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1b1c0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1b1d0 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
1b1e0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
1b1f0 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
1b200 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
1b210 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1b220 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1b230 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
1b240 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
1b250 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
1b260 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1b270 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
1b280 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1b290 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
1b2a0 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
1b2b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
1b2c0 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
1b2d0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
1b2e0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
1b2f0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
1b300 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1b310 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b320 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
1b330 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
1b340 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1b350 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1b360 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1b370 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1b380 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1b390 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b3a0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1b3b0 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1b3c0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1b3d0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1b3e0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1b3f0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1b400 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1b410 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1b420 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1b430 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1b440 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1b450 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1b460 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1b470 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1b480 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1b490 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1b4a0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1b4b0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1b4c0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1b4d0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1b4e0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1b4f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1b500 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1b510 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1b520 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1b530 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1b540 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1b550 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1b560 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1b570 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1b580 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1b590 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1b5a0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1b5b0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1b5c0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1b5d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1b5e0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1b5f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1b600 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1b610 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1b620 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1b630 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1b640 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1b650 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1b660 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1b670 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1b680 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1b690 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1b6a0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1b6b0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1b6c0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1b6d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1b6e0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1b6f0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1b700 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1b710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1b720 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1b730 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1b740 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1b750 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1b760 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1b770 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1b780 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b790 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1b7a0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1b7b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1b7c0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1b7d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1b7e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1b7f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1b800 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1b810 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1b820 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1b830 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1b840 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1b850 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1b860 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1b870 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1b880 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1b890 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1b8a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b8b0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1b8c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b8d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1b8e0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1b8f0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1b900 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1b910 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1b920 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1b930 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
1b940 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
1b950 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
1b960 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
1b970 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
1b980 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
1b990 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
1b9a0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
1b9b0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1b9c0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
1b9d0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
1b9e0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
1b9f0 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
1ba00 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
1ba10 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1ba20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1ba30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1ba40 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
1ba50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
1ba60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ba70 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
1ba80 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
1ba90 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
1baa0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
1bab0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1bac0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
1bad0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1bae0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1baf0 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
1bb00 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
1bb10 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1bb20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
1bb30 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1bb40 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
1bb50 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
1bb60 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
1bb70 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
1bb80 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1bb90 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
1bba0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
1bbb0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
1bbc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1bbd0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
1bbe0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
1bbf0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
1bc00 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
1bc10 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
1bc20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
1bc30 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
1bc40 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
1bc50 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
1bc60 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
1bc70 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
1bc80 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
1bc90 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
1bca0 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
1bcb0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
1bcc0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
1bcd0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1bce0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1bcf0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
1bd00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1bd10 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
1bd20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
1bd30 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
1bd40 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
1bd50 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
1bd60 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
1bd70 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
1bd80 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
1bd90 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
1bda0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1bdb0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1bdc0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
1bdd0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
1bde0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
1bdf0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
1be00 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1be10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1be20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1be30 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1be40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1be50 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
1be60 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
1be70 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1be80 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
1be90 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
1bea0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1beb0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1bec0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1bed0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1bee0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1bef0 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
1bf00 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1bf10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1bf20 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
1bf30 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1bf40 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1bf50 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
1bf60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1bf70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bf80 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1bf90 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
1bfa0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
1bfb0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
1bfc0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
1bfd0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1bfe0 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1bff0 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1c000 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1c010 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1c020 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1c030 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1c040 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1c050 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1c060 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1c070 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1c080 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1c090 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1c0a0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1c0b0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1c0c0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1c0d0 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1c0e0 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1c0f0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1c100 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1c110 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1c120 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1c130 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1c140 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1c150 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1c160 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1c170 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1c180 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1c190 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1c1a0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1c1b0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1c1c0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1c1d0 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1c1e0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1c1f0 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1c200 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c210 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1c220 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c230 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1c240 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1c250 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1c260 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1c270 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1c280 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1c290 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1c2a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c2b0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1c2c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1c2d0 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1c2e0 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1c2f0 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1c300 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1c310 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1c320 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1c330 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1c340 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1c350 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1c360 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1c370 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1c380 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1c390 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1c3a0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1c3b0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1c3c0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1c3d0 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1c3e0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1c3f0 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1c400 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1c410 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1c420 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1c430 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1c440 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1c450 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1c460 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1c470 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1c480 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1c490 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1c4a0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1c4b0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1c4c0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1c4d0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1c4e0 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1c4f0 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1c500 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1c510 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1c520 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1c530 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1c540 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1c550 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1c560 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1c570 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1c580 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1c590 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1c5a0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1c5b0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1c5c0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1c5d0 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1c5e0 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1c5f0 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1c600 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1c610 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1c620 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1c630 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1c640 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a  nt wrflag, int *
1c650 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b  pSchemaVersion){
1c660 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c670 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1c680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c690 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1c6a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1c6b0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1c6c0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1c6d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1c6e0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1c6f0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1c700 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1c710 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1c720 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1c730 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1c740 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1c750 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1c760 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1c770 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1c780 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1c790 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1c7a0 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1c7b0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1c7c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1c7d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c7e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1c7f0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1c800 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1c810 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e 64   );..  if( (p->d
1c820 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1c830 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29  E_ResetDatabase)
1c840 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50   .   && sqlite3P
1c850 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
1c860 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 0a  Bt->pPager)==0 .
1c870 20 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62 74    ){.    pBt->bt
1c880 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 52  sFlags &= ~BTS_R
1c890 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20  EAD_ONLY;.  }.. 
1c8a0 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1c8b0 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1c8c0 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1c8d0 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1c8e0 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1c8f0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1c900 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1c910 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1c920 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1c930 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1c940 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1c950 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c960 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1c970 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a   {.    sqlite3 *
1c980 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  pBlock = 0;.    
1c990 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
1c9a0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
1c9b0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
1c9c0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
1c9d0 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  tion .    ** on 
1c9e0 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1c9f0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1ca00 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1ca10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1ca20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
1ca30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
1ca40 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  CKED..    */.   
1ca50 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1ca60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ca70 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1ca80 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  .     || (pBt->b
1ca90 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1caa0 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b  NDING)!=0.    ){
1cab0 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  .      pBlock = 
1cac0 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1cad0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1cae0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
1caf0 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1cb00 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72  .      for(pIter
1cb10 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1cb20 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1cb30 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1cb40 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1cb50 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1cb60 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1cb70 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1cb80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1cb90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cba0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1cbb0 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  pBlock ){.      
1cbc0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
1cbd0 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
1cbe0 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  pBlock);.      r
1cbf0 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1cc00 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1cc10 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
1cc20 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begun;.    }.  }
1cc30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1cc40 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1cc50 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1cc60 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1cc70 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1cc80 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1cc90 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1cca0 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1ccb0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1ccc0 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1ccd0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1cce0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1ccf0 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1cd00 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1cd10 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1cd20 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1cd30 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1cd40 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1cd50 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1cd60 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1cd70 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1cd80 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1cd90 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1cda0 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1cdb0 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1cdc0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1cdd0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1cde0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1cdf0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1ce00 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1ce10 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1ce20 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1ce30 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1ce40 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1ce50 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1ce60 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1ce70 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1ce80 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1ce90 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1cea0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1ceb0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1cec0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1ced0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1cee0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1cef0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1cf00 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1cf10 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1cf20 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1cf30 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1cf40 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1cf50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1cf60 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1cf70 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1cf80 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1cf90 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1cfa0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1cfb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cfc0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1cfd0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1cfe0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1cff0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1d000 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1d010 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1d020 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d030 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d040 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
1d050 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
1d060 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
1d070 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
1d080 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d0a0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1d0b0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1d0c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1d0d0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  ==SQLITE_BUSY_SN
1d0e0 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e 69  APSHOT && pBt->i
1d0f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1d100 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1d110 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72        /* if ther
1d120 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61 63  e was no transac
1d130 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65 6e  tion opened when
1d140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
1d150 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1d160 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49 54  called and SQLIT
1d170 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
1d180 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68 61  is returned, cha
1d190 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20 20  nge the error.  
1d1a0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20          ** code 
1d1b0 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  to SQLITE_BUSY. 
1d1c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1d1d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1d1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d1f0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1d200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d210 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
1d220 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1d230 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
1d240 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
1d250 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
1d260 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1d270 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
1d280 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
1d290 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
1d2a0 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  pBt) );.  sqlite
1d2b0 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54  3PagerResetLockT
1d2c0 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67  imeout(pBt->pPag
1d2d0 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  er);..  if( rc==
1d2e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d2f0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1d300 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1d310 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1d320 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1d330 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1d340 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1d350 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1d360 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1d370 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1d380 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1d390 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1d3a0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1d3b0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1d3c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1d3d0 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1d3e0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1d3f0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1d400 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1d410 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1d420 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1d430 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1d440 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1d450 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1d460 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1d470 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1d480 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1d490 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1d4a0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1d4b0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1d4c0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1d4d0 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1d4e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1d4f0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1d500 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1d510 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1d520 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1d530 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1d540 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1d550 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1d560 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1d570 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1d580 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1d590 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1d5a0 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1d5b0 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1d5c0 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1d5d0 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1d5e0 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1d5f0 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1d600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d610 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1d620 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1d630 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1d640 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1d650 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1d660 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1d670 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1d680 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1d690 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1d6a0 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1d6b0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1d6c0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1d6d0 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1d6e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1d6f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d700 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1d710 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1d720 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1d730 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d740 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1d750 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1d760 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1d770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d780 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1d790 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d7a0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1d7b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d7c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74    }.    }.  }..t
1d7d0 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
1d7e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d7f0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  ){.    if( pSche
1d800 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  maVersion ){.   
1d810 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69     *pSchemaVersi
1d820 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  on = get4byte(&p
1d830 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1d840 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  a[40]);.    }.  
1d850 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1d860 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1d870 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1d880 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1d890 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1d8a0 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ber of.      ** 
1d8b0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1d8c0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1d8d0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1d8e0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1d8f0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d       ** the sub-
1d900 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1d910 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1d920 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1d930 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ned here..      
1d940 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1d950 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1d960 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1d970 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
1d980 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
1d990 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1d9a0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
1d9b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1d9c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d9d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d9e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1d9f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
1da00 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
1da10 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
1da20 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
1da30 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
1da40 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
1da50 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
1da60 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1da70 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
1da80 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
1da90 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
1daa0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
1dab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1dac0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
1dad0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1dae0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
1db10 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
1db20 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
1db50 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
1db60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1db90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
1dba0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1dbb0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
1dbc0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1dbd0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1dbe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1dbf0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1dc00 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1dc10 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20  pPage->isInit ? 
1dc20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65  SQLITE_OK : btre
1dc30 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1dc40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1dc50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1dc60 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  c;.  nCell = pPa
1dc70 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
1dc80 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1dc90 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1dca0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1dcb0 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
1dcc0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
1dcd0 70 50 61 67 65 2c 20 70 50 61 67 65 2c 20 70 43  pPage, pPage, pC
1dce0 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
1dcf0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1dd00 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
1dd10 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1dd20 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
1dd30 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1dd40 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1dd50 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1dd60 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1dd70 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1dd80 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1dd90 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1dda0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1ddb0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1ddc0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
1ddd0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1dde0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1ddf0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1de00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1de10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
1de20 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
1de30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1de40 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
1de50 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
1de60 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
1de70 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
1de80 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
1de90 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
1dea0 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
1deb0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
1dec0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
1ded0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
1dee0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
1def0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1df00 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1df10 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1df30 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
1df40 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1df50 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
1df60 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1df70 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1df80 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
1dfb0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
1dfc0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
1dfd0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1dfe0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
1dff0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
1e000 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1e010 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
1e020 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
1e030 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
1e040 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
1e050 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1e060 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1e070 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
1e080 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
1e090 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
1e0a0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
1e0b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e0c0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1e0d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1e0e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1e0f0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
1e100 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
1e110 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e120 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
1e130 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
1e140 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
1e150 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
1e160 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
1e170 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
1e180 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
1e190 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
1e1a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e1b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1e1c0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
1e1d0 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
1e1e0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
1e1f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e200 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
1e210 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
1e220 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ;..    rc = pPag
1e230 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49  e->isInit ? SQLI
1e240 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69  TE_OK : btreeIni
1e250 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1e260 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e270 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  n rc;.    nCell 
1e280 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1e290 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e2a0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1e2b0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1e2c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1e2d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
1e2e0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1e2f0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
1e300 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1e310 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
1e320 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
1e330 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1e340 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
1e350 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
1e360 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
1e370 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
1e380 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e  .nSize > pPage->
1e390 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74  aData+pPage->pBt
1e3a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1e3c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e3d0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1e3e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e3f0 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
1e400 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  get4byte(pCell+i
1e410 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a  nfo.nSize-4) ){.
1e420 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1e430 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1e440 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20  nSize-4, iTo);. 
1e450 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1e460 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1e480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1e490 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1e4a0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
1e4b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1e4c0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
1e4d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e4f0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
1e500 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
1e510 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1e520 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
1e530 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
1e540 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1e550 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1e560 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
1e570 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e580 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1e590 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
1e5a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e5b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1e5c0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1e5d0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
1e5e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e5f0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1e600 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1e610 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1e620 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1e630 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1e640 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1e650 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1e660 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1e670 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1e680 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1e690 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1e6a0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1e6b0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1e6c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1e6d0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1e6e0 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1e6f0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1e700 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1e710 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1e720 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1e730 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1e740 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1e750 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1e760 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1e770 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1e780 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1e790 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1e7a0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1e7b0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1e7c0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1e7d0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1e7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1e7f0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1e800 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1e810 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1e820 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1e830 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1e840 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1e850 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1e860 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1e870 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e880 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1e890 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1e8a0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1e8b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1e8c0 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1e8d0 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1e8e0 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1e8f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1e900 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1e910 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1e920 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1e930 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1e940 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1e950 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1e960 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1e970 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1e980 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1e990 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1e9a0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1e9b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1e9c0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1e9d0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1e9e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1e9f0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1ea00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ea10 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1ea20 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1ea30 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1ea40 42 74 20 29 3b 0a 20 20 69 66 28 20 69 44 62 50  Bt );.  if( iDbP
1ea50 61 67 65 3c 33 20 29 20 72 65 74 75 72 6e 20 53  age<3 ) return S
1ea60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ea70 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70  PT;..  /* Move p
1ea80 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1ea90 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1eaa0 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1eab0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1eac0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1ead0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1eae0 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1eaf0 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1eb00 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1eb10 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1eb20 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1eb30 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1eb40 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1eb50 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1eb60 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1eb70 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1eb80 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1eb90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ebb0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1ebc0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1ebd0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1ebe0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1ebf0 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1ec00 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1ec10 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1ec20 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1ec30 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1ec40 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1ec50 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1ec60 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1ec70 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1ec80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1ec90 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1eca0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1ecb0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1ecc0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1ecd0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1ece0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1ecf0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1ed00 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1ed10 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1ed20 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1ed30 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1ed40 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1ed50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1ed60 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1ed70 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1ed80 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1ed90 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1eda0 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1edb0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1edc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1edd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1ede0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1edf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1ee00 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1ee10 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1ee20 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1ee30 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1ee40 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1ee50 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1ee60 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1ee70 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1ee80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ee90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1eea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1eeb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1eec0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1eed0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1eee0 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1eef0 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1ef00 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1ef10 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1ef20 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1ef30 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1ef40 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1ef50 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1ef60 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1ef70 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1ef80 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1ef90 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1efa0 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1efb0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1efc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1efd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1efe0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1eff0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f000 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1f010 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f030 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f040 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1f050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f060 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1f070 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1f080 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1f090 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1f0a0 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1f0b0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1f0c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f0d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1f0e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1f0f0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1f100 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1f110 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1f130 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1f140 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1f150 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1f160 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1f170 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1f180 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1f190 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1f1a0 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1f1b0 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1f1c0 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1f1d0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1f1e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1f1f0 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1f200 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1f210 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1f220 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1f230 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1f240 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1f250 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1f260 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1f270 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1f280 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1f290 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1f2a0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1f2b0 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1f2c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1f2d0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1f2e0 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1f2f0 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1f300 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1f310 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1f320 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1f330 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1f340 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1f350 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1f360 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1f370 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1f380 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1f390 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1f3a0 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1f3b0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1f3c0 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1f3d0 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1f3e0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1f3f0 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1f400 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1f410 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1f420 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1f430 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1f440 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1f450 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1f460 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1f470 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1f480 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1f490 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1f4a0 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1f4b0 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1f4c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1f4d0 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1f4e0 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1f4f0 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1f500 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1f510 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1f520 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1f530 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1f540 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f550 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1f560 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1f570 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1f580 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f590 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1f5a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f5b0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1f5c0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1f5d0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1f5e0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1f5f0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1f600 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1f610 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1f620 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1f630 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1f640 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1f650 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f660 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1f670 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1f680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1f690 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1f6a0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1f6b0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1f6c0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1f6d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f6e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f6f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f700 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1f710 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1f720 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f730 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f740 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1f750 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1f760 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1f770 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1f780 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1f790 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1f7a0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1f7b0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1f7c0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1f7d0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1f7e0 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1f7f0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1f800 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1f810 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1f820 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1f830 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1f840 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1f850 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1f860 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1f870 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1f880 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1f890 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1f8a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f8b0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1f8c0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1f8d0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1f8e0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1f8f0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1f900 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1f910 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1f920 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1f930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f950 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1f970 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1f980 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1f990 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1f9a0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1f9b0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1f9c0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f9e0 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1f9f0 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1fa00 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1fa10 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1fa20 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1fa30 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1fa40 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1fa50 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1fa60 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1fa70 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1fa80 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1fa90 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1faa0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1fab0 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1fac0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1fad0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1fae0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1faf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1fb00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fb10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fb20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1fb30 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1fb40 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1fb50 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1fb60 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1fb70 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1fb80 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1fb90 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1fba0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1fbb0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1fbc0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1fbd0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1fbe0 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1fbf0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1fc00 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1fc10 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1fc20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1fc30 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1fc40 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1fc50 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1fc60 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1fc70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1fc80 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1fc90 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1fca0 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1fcb0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1fcc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fcd0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1fce0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1fcf0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1fd00 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1fd10 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1fd20 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1fd30 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1fd40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fd50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1fd60 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1fd70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1fd80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1fd90 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1fda0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1fdb0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1fdc0 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1fdd0 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1fde0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1fdf0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1fe00 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1fe10 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1fe20 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1fe30 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1fe40 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1fe50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1fe60 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1fe70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fe80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fe90 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1fea0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1feb0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1fec0 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1fed0 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1fee0 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1fef0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1ff00 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1ff10 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1ff20 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1ff30 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1ff40 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1ff50 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1ff60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ff70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1ff80 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1ff90 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1ffa0 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1ffb0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1ffc0 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1ffd0 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1ffe0 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1fff0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
20000 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
20010 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20020 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
20030 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
20040 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
20050 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
20060 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
20070 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
20080 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
20090 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
200c0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
200d0 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
200e0 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20100 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
20110 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
20120 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
20130 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
20140 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
20150 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
20160 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
20170 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
20180 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
20190 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
201a0 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
201b0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
201c0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
201d0 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
201e0 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
201f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20200 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
20210 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
20220 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
20230 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
20240 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
20250 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
20260 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20270 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
20280 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
20290 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
202a0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
202b0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
202c0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
202d0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
202e0 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
202f0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
20300 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
20310 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
20320 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
20330 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
20340 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
20350 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
20360 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
20370 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
20380 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
20390 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
203a0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
203b0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
203c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
203d0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
203e0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
203f0 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
20400 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
20410 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
20420 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
20430 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20440 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
20450 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
20460 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
20470 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
20480 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
20490 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
204a0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
204b0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
204c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
204d0 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
204e0 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
204f0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
20500 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
20510 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
20520 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
20530 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
20540 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
20550 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
20560 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
20570 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
20580 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20590 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
205a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
205b0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
205c0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
205d0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
205e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
205f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20600 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
20610 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
20620 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
20630 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
20640 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
20650 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
20680 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20690 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
206a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
206b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
206c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
206d0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
206e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
206f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
20700 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
20710 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
20720 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
20730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20740 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
20750 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
20760 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
20770 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
20780 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
20790 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
207a0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
207b0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
207c0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
207d0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
207e0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
207f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
20800 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
20810 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
20820 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
20830 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
20840 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
20850 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
20860 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
20870 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
20880 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
20890 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
208a0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
208b0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
208c0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
208d0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
208e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
208f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
20900 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
20910 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
20920 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
20930 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
20940 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74  er); )..  assert
20950 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20960 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
20970 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
20980 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
20990 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
209a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
209b0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
209c0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
209d0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
209e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
209f0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
20a00 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
20a10 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
20a20 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
20a30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
20a40 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
20a50 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
20a60 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
20a70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
20a80 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
20a90 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
20aa0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
20ab0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
20ac0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
20ad0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
20ae0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
20af0 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
20b00 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
20b10 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
20b20 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20b30 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
20b40 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
20b50 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
20b60 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
20b70 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
20b80 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
20b90 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
20ba0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
20bb0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
20bc0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
20bd0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
20be0 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
20bf0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
20c00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
20c10 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20c20 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
20c30 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
20c40 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
20c50 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
20c60 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
20c70 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
20c80 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
20c90 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
20ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20cb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
20cc0 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
20cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
20ce0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
20cf0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
20d00 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
20d10 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
20d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
20d30 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
20d40 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
20d50 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
20d60 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
20d70 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
20d80 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
20d90 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
20da0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
20db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20dc0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
20dd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20de0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
20df0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
20e00 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
20e10 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
20e20 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
20e30 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
20e40 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
20e50 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
20e60 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
20e70 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
20e80 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
20e90 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
20ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
20ec0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
20ed0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
20ee0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20ef0 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
20f00 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
20f10 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
20f20 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
20f30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20f40 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
20f50 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
20f60 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
20f70 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
20f80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20f90 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
20fa0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
20fb0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
20fc0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
20fd0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
20fe0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
20ff0 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
21000 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
21010 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
21020 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
21030 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
21040 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
21050 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
21060 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
21070 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
21080 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
21090 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
210a0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
210b0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
210c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
210d0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
210e0 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
210f0 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
21100 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
21110 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
21120 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
21130 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
21140 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
21150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
21160 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
21170 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
21180 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
21190 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
211a0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
211b0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
211c0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
211d0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
211e0 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
211f0 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
21200 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
21210 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
21220 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
21230 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
21240 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
21250 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
21260 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
21270 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
21280 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
21290 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
212a0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
212b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
212c0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
212d0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
212e0 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
212f0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
21300 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
21310 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
21320 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
21330 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
21340 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
21350 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
21360 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
21370 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
21380 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
21390 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
213a0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
213b0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
213c0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
213d0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
213e0 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
213f0 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
21400 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
21410 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
21420 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
21430 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
21440 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
21450 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
21460 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
21470 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
21480 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
21490 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
214a0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
214b0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
214c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
214d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
214e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
214f0 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
21500 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
21510 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21520 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
21530 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21540 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
21550 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21560 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21570 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
21580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21590 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
215a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
215b0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
215c0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
215d0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
215e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
215f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21600 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21610 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21620 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21630 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
21640 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
21650 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21660 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
21670 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
21680 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
21690 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
216a0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
216b0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
216c0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
216d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
216e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
216f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21700 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21710 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
21720 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
21730 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
21740 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
21750 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
21760 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
21770 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
21780 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
21790 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
217a0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
217b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
217c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
217d0 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
217e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
217f0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
21800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21810 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21820 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
21830 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
21840 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
21850 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
21860 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
21870 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
21880 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
21890 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
218a0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
218b0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
218c0 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
218d0 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
218e0 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
218f0 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
21900 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
21910 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
21920 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21930 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
21940 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
21950 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
21960 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
21970 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21980 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
21990 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
219a0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
219b0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
219c0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
219d0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
219e0 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
219f0 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
21a00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
21a10 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
21a20 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
21a30 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
21a40 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
21a50 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
21a60 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
21a70 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
21a80 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
21a90 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
21aa0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
21ab0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
21ac0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
21ad0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
21ae0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
21af0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
21b00 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
21b10 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
21b20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21b30 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
21b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21b50 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
21b60 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
21b70 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
21b80 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
21b90 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
21ba0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
21bb0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
21bc0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
21bd0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
21be0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
21bf0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
21c00 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
21c10 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
21c20 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
21c30 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
21c40 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
21c50 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
21c60 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
21c70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21c80 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
21c90 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
21ca0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
21cb0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
21cc0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21cd0 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
21ce0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
21cf0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
21d00 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
21d10 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
21d20 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
21d30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21d40 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
21d50 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
21d60 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
21d70 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
21d80 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
21d90 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
21da0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
21db0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
21dc0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
21dd0 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
21de0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
21df0 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
21e00 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
21e10 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
21e20 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
21e30 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
21e40 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
21e50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
21e60 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
21e70 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
21e80 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
21e90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
21ea0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
21eb0 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
21ec0 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
21ed0 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
21ee0 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
21ef0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
21f00 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
21f10 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
21f20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
21f30 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
21f40 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
21f50 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
21f60 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
21f70 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
21f80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
21f90 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
21fa0 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
21fb0 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
21fc0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
21fd0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
21fe0 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
21ff0 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
22000 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
22010 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
22020 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
22030 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
22040 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
22050 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
22060 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
22070 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
22080 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
22090 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
220a0 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
220b0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
220c0 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
220d0 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
220e0 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
220f0 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
22100 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
22110 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
22120 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
22130 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
22140 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
22150 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
22160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22170 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
22180 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
22190 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
221a0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
221b0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
221c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
221d0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
221e0 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
221f0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
22200 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
22210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22220 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
22230 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
22240 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
22250 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
22260 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
22270 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
22280 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
22290 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
222a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
222b0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
222c0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
222d0 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
222e0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
222f0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
22300 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
22310 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22320 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
22330 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22340 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
22350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
22360 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
22370 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
22380 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
22390 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
223a0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
223b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
223c0 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
223d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
223e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
223f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22400 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
22410 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
22420 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
22430 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
22440 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
22450 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
22460 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
22470 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
22480 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
22490 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
224a0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
224b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
224c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
224d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
224e0 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
224f0 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
22500 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
22510 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
22520 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
22530 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
22540 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22550 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
22560 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
22570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22580 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
22590 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
225a0 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
225b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
225c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
225d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
225e0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
225f0 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
22600 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
22610 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
22620 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
22630 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
22640 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
22650 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
22660 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
22670 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
22680 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
22690 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
226a0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
226b0 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
226c0 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
226d0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
226e0 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
226f0 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
22700 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
22710 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
22720 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
22730 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
22740 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
22750 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
22760 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
22770 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
22780 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
22790 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
227a0 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
227b0 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
227c0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
227d0 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
227e0 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
227f0 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
22800 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
22810 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
22820 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
22830 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
22840 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
22850 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
22860 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
22870 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
22880 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
22890 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
228a0 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
228b0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
228c0 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
228d0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
228e0 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
228f0 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
22900 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
22910 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
22920 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
22930 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
22940 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
22950 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
22960 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
22970 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
22980 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
22990 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
229a0 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
229b0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
229c0 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
229d0 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
229e0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
229f0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
22a00 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
22a10 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
22a20 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
22a30 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
22a40 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
22a50 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
22a60 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
22a70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
22a80 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
22a90 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
22aa0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
22ab0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
22ac0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
22ad0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
22ae0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
22af0 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
22b00 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
22b10 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
22b20 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
22b30 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
22b40 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
22b50 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
22b60 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
22b70 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
22b80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
22b90 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
22ba0 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
22bb0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
22bc0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
22bd0 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26   if( writeOnly &
22be0 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26  & (p->curFlags &
22bf0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
22c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
22c10 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
22c20 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
22c30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22c40 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
22c50 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
22c60 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
22c70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
22ca0 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54  id)sqlite3BtreeT
22cb0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  ripAllCursors(pB
22cc0 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20  tree, rc, 0);.  
22cd0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
22ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
22d00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
22d10 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
22d20 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20  sor(p);.        
22d30 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
22d40 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20  OR_FAULT;.      
22d50 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
22d60 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d  errCode;.      }
22d70 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65  .      btreeRele
22d80 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
22d90 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s(p);.    }.    
22da0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22db0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
22dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22dd0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 42 74  *.** Set the pBt
22de0 2d 3e 6e 50 61 67 65 20 66 69 65 6c 64 20 63 6f  ->nPage field co
22df0 72 72 65 63 74 6c 79 2c 20 61 63 63 6f 72 64 69  rrectly, accordi
22e00 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
22e10 74 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 74 68  t.** state of th
22e20 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 73 73  e database.  Ass
22e30 75 6d 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ume pBt->pPage1 
22e40 69 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  is valid..*/.sta
22e50 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 53 65  tic void btreeSe
22e60 74 4e 50 61 67 65 28 42 74 53 68 61 72 65 64 20  tNPage(BtShared 
22e70 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
22e80 50 61 67 65 31 29 7b 0a 20 20 69 6e 74 20 6e 50  Page1){.  int nP
22e90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
22ea0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
22eb0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
22ec0 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nPage==0 );.  if
22ed0 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
22ee0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
22ef0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
22f00 26 6e 50 61 67 65 29 3b 0a 20 20 74 65 73 74 63  &nPage);.  testc
22f10 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
22f20 3d 6e 50 61 67 65 20 29 3b 0a 20 20 70 42 74 2d  =nPage );.  pBt-
22f30 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
22f40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
22f50 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
22f60 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  n in progress..*
22f70 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65  *.** If tripCode
22f80 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
22f90 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77  K then cursors w
22fa0 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
22fb0 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a  ed (tripped)..**
22fc0 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
22fd0 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20  ors are tripped 
22fe0 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
22ff0 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72  true but all cur
23000 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70  sors are.** trip
23010 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
23020 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20   is false.  Any 
23030 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a  attempt to use.*
23040 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73  * a tripped curs
23050 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  or will result i
23060 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
23070 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
23080 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
23090 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
230a0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
230b0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
230c0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
230d0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
230e0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
230f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23100 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
23110 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c  p, int tripCode,
23120 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
23130 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
23140 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23150 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
23160 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
23170 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20  t( writeOnly==1 
23180 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  || writeOnly==0 
23190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69  );.  assert( tri
231a0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42  pCode==SQLITE_AB
231b0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  ORT_ROLLBACK || 
231c0 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
231d0 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
231e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
231f0 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
23200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23210 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
23220 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
23230 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
23240 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c  f( rc ) writeOnl
23250 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
23260 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23270 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
23280 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  ipCode ){.    in
23290 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42  t rc2 = sqlite3B
232a0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
232b0 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  rs(p, tripCode, 
232c0 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20  writeOnly);.    
232d0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
232e0 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f  TE_OK || (writeO
232f0 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53  nly==0 && rc2==S
23300 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20  QLITE_OK) );.   
23310 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
23320 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
23330 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67    }.  btreeInteg
23340 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
23350 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23360 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
23370 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
23380 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
23390 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
233a0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
233b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
233c0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
233d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
233e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
233f0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
23400 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
23410 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
23420 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
23430 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
23440 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
23450 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
23460 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
23470 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
23480 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
23490 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
234a0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
234b0 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
234c0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
234d0 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
234e0 29 7b 0a 20 20 20 20 20 20 62 74 72 65 65 53 65  ){.      btreeSe
234f0 74 4e 50 61 67 65 28 70 42 74 2c 20 70 50 61 67  tNPage(pBt, pPag
23500 65 31 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  e1);.      relea
23510 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
23520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
23530 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
23540 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
23550 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
23560 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
23570 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
23580 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
23590 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
235a0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
235b0 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
235c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
235d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
235e0 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
235f0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
23600 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
23610 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
23620 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
23630 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
23640 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
23650 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
23660 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
23670 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
23680 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
23690 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
236a0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
236b0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
236c0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
236d0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
236e0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
236f0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
23700 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
23710 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
23720 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
23730 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
23740 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
23750 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
23760 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
23770 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
23780 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
23790 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
237a0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
237b0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
237c0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
237d0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
237e0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
237f0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
23800 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
23810 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
23820 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
23830 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
23840 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
23850 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
23860 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
23870 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
23880 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
23890 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
238a0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
238b0 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
238c0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
238d0 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
238e0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
238f0 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
23900 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
23910 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
23920 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
23930 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
23940 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
23950 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
23960 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
23970 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
23980 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
23990 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
239a0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
239b0 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
239c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
239d0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
239e0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
239f0 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
23a00 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
23a10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
23a20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23a30 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
23a40 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
23a50 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
23a60 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
23a70 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
23a80 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
23a90 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
23aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
23ab0 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
23ac0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
23ad0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
23ae0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
23af0 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
23b00 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
23b10 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
23b20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
23b30 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
23b40 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
23b50 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
23b60 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
23b70 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
23b80 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
23b90 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
23ba0 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
23bb0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
23bc0 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
23bd0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
23be0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
23bf0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
23c00 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
23c10 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
23c20 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
23c30 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
23c40 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
23c50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
23c60 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
23c70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23c80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23c90 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
23ca0 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
23cb0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
23cc0 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
23cd0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
23ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
23cf0 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
23d00 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
23d10 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
23d20 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
23d30 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
23d40 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
23d50 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
23d60 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
23d70 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
23d80 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
23d90 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
23da0 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
23db0 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
23dc0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
23dd0 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
23de0 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
23df0 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
23e00 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
23e10 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
23e20 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
23e30 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
23e40 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
23e50 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
23e60 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
23e70 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
23e80 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
23e90 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
23ea0 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
23eb0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
23ec0 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
23ed0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
23ee0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
23ef0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23f00 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
23f10 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23f20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
23f30 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
23f40 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
23f50 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
23f60 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
23f70 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
23f80 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
23f90 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
23fa0 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
23fb0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23fc0 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
23fd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23fe0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
23ff0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
24000 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
24010 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
24020 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
24030 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24050 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24060 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
24070 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
24080 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
24090 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
240a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
240b0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
240c0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
240d0 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
240e0 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
240f0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
24100 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
24110 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
24120 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
24130 20 62 74 72 65 65 53 65 74 4e 50 61 67 65 28 70   btreeSetNPage(p
24140 42 74 2c 20 70 42 74 2d 3e 70 50 61 67 65 31 29  Bt, pBt->pPage1)
24150 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 42 74 2d  ;..      /* pBt-
24160 3e 6e 50 61 67 65 20 6d 69 67 68 74 20 62 65 20  >nPage might be 
24170 7a 65 72 6f 20 69 66 20 74 68 65 20 64 61 74 61  zero if the data
24180 62 61 73 65 20 77 61 73 20 63 6f 72 72 75 70 74  base was corrupt
24190 20 77 68 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   when .      ** 
241a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
241b0 77 61 73 20 73 74 61 72 74 65 64 2e 20 4f 74 68  was started. Oth
241c0 65 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74 20  erwise, it must 
241d0 62 65 20 61 74 20 6c 65 61 73 74 20 31 2e 20 20  be at least 1.  
241e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
241f0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70   CORRUPT_DB || p
24200 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
24210 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24220 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24230 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24240 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
24250 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
24260 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
24270 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
24280 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
24290 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
242a0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
242b0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
242c0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
242d0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
242e0 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
242f0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
24300 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
24310 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
24320 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
24330 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
24340 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
24350 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
24360 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
24370 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
24380 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  on..**.** If the
24390 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74   BTREE_WRCSR bit
243a0 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c   of wrFlag is cl
243b0 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ear, then the cu
243c0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a  rsor can only.**
243d0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
243e0 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54  ding.  If the BT
243f0 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73  REE_WRCSR bit is
24400 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63   set, then the c
24410 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20  ursor.** can be 
24420 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
24430 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20   or for writing 
24440 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
24450 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ons for writing.
24460 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ** are also met.
24470 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20    These are the 
24480 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
24490 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
244a0 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74  rder.** for writ
244b0 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65  ing to be allowe
244c0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
244d0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
244e0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
244f0 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69  th wrFlag contai
24500 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52  ning BTREE_WRCSR
24510 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
24520 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24530 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
24540 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
24550 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
24560 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
24570 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
24580 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
24590 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
245a0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
245b0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
245c0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
245d0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
245e0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
245f0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
24600 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
24610 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
24620 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
24630 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
24640 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24650 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
24660 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
24670 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
24680 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
24690 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
246a0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
246b0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
246c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
246d0 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20  BTREE_FORDELETE 
246e0 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61  bit of wrFlag ma
246f0 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20  y optionally be 
24700 73 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43  set if BTREE_WRC
24710 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49  SR.** is set.  I
24720 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73  f FORDELETE is s
24730 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69  et, that is a hi
24740 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
24750 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  entation that.**
24760 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c   this cursor wil
24770 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74  l only be used t
24780 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65  o seek to and de
24790 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20  lete entries of 
247a0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70  an index.** as p
247b0 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20  art of a larger 
247c0 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
247d0 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45  .  The FORDELETE
247e0 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65   hint is not use
247f0 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70  d by.** this imp
24800 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75  lementation.  Bu
24810 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69  t in a hypotheti
24820 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20  cal alternative 
24830 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a  storage engine .
24840 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65  ** in which inde
24850 78 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75  x entries are au
24860 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
24870 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70  ted when corresp
24880 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20  onding table.** 
24890 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64  rows are deleted
248a0 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20  , the FORDELETE 
248b0 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74  flag is a hint t
248c0 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64  hat all SEEK and
248d0 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61   DELETE.** opera
248e0 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75  tions on this cu
248f0 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f  rsor can be no-o
24900 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20  ps and all READ 
24910 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a  operations can .
24920 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c  ** return a null
24930 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30   row (2-bytes: 0
24940 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a  x01 0x00)..**.**
24950 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
24960 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
24970 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
24980 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
24990 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
249a0 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
249b0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
249c0 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
249d0 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
249e0 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
249f0 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
24a00 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ed that the sqli
24a10 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
24a20 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  ro() has been ca
24a30 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20  lled.** on pCur 
24a40 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
24a50 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70  e memory space p
24a60 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
24a70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
24a80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
24a90 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
24aa0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ac0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
24ad0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24b00 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
24b10 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
24b20 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
24b50 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
24b60 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
24b70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b90 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
24ba0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
24bb0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
24bc0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24be0 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
24bf0 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  rsor */.){.  BtS
24c00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
24c10 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
24c20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d      /* Shared b-
24c30 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tree handle */. 
24c40 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20   BtCursor *pX;  
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69          /* Loopi
24c70 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c  ng over other al
24c80 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20  l cursors */..  
24c90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
24ca0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
24cb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
24cc0 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20  rFlag==0 .      
24cd0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45   || wrFlag==BTRE
24ce0 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20  E_WRCSR .       
24cf0 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45  || wrFlag==(BTRE
24d00 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f  E_WRCSR|BTREE_FO
24d10 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a  RDELETE) .  );..
24d20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
24d30 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
24d40 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
24d50 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
24d60 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
24d70 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
24d80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
24d90 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
24da0 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
24db0 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
24dc0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
24dd0 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
24de0 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
24df0 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
24e00 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
24e10 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
24e20 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
24e30 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
24e40 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46  KeyInfo!=0, (wrF
24e50 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61  lag?2:1)) );.  a
24e60 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
24e70 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
24e80 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
24e90 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
24ea0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
24eb0 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
24ec0 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
24ed0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
24ee0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
24ef0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
24f00 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24f10 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
24f20 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
24f30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
24f40 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
24f50 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  e1->aData );.  a
24f60 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
24f70 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
24f80 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
24f90 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  LY)==0 );..  if(
24fa0 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
24fb0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
24fc0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
24fd0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
24fe0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
24ff0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
25000 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
25010 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
25020 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
25030 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
25040 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
25050 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
25060 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
25070 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
25080 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
25090 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
250a0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
250b0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
250c0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
250d0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
250e0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
250f0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
25100 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
25110 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
25120 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
25130 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
25140 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
25150 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
25160 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77  ur->curFlags = w
25170 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69  rFlag ? BTCF_Wri
25180 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43  teFlag : 0;.  pC
25190 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
251a0 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a  s = wrFlag ? 0 :
251b0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
251c0 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65  NLY;.  /* If the
251d0 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f  re are two or mo
251e0 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  re cursors on th
251f0 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68  e same btree, th
25200 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a  en all such.  **
25210 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20   cursors *must* 
25220 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75  have the BTCF_Mu
25230 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
25240 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74   */.  for(pX=pBt
25250 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70  ->pCursor; pX; p
25260 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
25270 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f    if( pX->pgnoRo
25280 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65  ot==(Pgno)iTable
25290 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75   ){.      pX->cu
252a0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
252b0 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70  ultiple;.      p
252c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
252d0 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
252e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
252f0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
25300 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70  Cursor;.  pBt->p
25310 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
25320 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
25330 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
25340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25350 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
25360 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
25370 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
253a0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
253b0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
253e0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
253f0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
25400 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
25430 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
25440 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
25450 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
25460 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
25470 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
25480 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
25490 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
254a0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
254d0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
254e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
254f0 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20  iTable<1 ){.    
25500 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25510 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  UPT_BKPT;.  }els
25520 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  e{.    sqlite3Bt
25530 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
25540 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
25550 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
25560 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
25570 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Cur);.    sqlite
25580 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
25590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
255a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
255b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
255c0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
255d0 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
255e0 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
255f0 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
25600 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
25610 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
25620 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
25630 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
25640 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
25650 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
25660 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
25670 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
25680 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
25690 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
256a0 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
256b0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
256c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
256d0 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
256e0 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52  oid){.  return R
256f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43  OUND8(sizeof(BtC
25700 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ursor));.}../*.*
25710 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
25720 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
25730 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
25740 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
25750 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d  t..**.** The sim
25760 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72  ple approach her
25770 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65  e would be to me
25780 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72  mset() the entir
25790 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a  e object.** to z
257a0 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72  ero.  But it tur
257b0 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  ns out that the 
257c0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
257d0 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64  dx[] arrays.** d
257e0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  o not need to be
257f0 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79   zeroed and they
25800 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77   are large, so w
25810 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74  e can save a lot
25820 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20  .** of run-time 
25830 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20  by skipping the 
25840 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
25850 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73  f those elements
25860 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25870 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
25880 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
25890 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66   memset(p, 0, of
258a0 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c  fsetof(BtCursor,
258b0 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54 5f   BTCURSOR_FIRST_
258c0 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a  UNINIT));.}../*.
258d0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
258e0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
258f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
25900 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
25910 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
25920 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
25930 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
25940 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
25950 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
25960 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
25970 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
25980 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
25990 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  ee ){.    BtShar
259a0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
259b0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
259c0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
259d0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
259e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
259f0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
25a00 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
25a10 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
25a20 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
25a30 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
25a40 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
25a50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
25a60 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
25a70 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
25a80 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
25a90 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
25aa0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
25ab0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
25ac0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
25ad0 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
25ae0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
25af0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
25b00 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
25b10 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65 6c    }.    btreeRel
25b20 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
25b30 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75 6e  es(pCur);.    un
25b40 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
25b50 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  d(pBt);.    sqli
25b60 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
25b70 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73  Overflow);.    s
25b80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
25b90 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c  ->pKey);.    sql
25ba0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25bb0 42 74 72 65 65 29 3b 0a 20 20 20 20 70 43 75 72  Btree);.    pCur
25bc0 2d 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  ->pBtree = 0;.  
25bd0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
25be0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
25bf0 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
25c00 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
25c10 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
25c20 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
25c30 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
25c40 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
25c50 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
25c60 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
25c70 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
25c80 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
25c90 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
25ca0 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
25cb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
25cc0 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
25cd0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
25ce0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
25cf0 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
25d00 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
25d10 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
25d20 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
25d30 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75   int cellInfoEqu
25d40 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20  al(CellInfo *a, 
25d50 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20  CellInfo *b){.  
25d60 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62    if( a->nKey!=b
25d70 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20  ->nKey ) return 
25d80 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50  0;.    if( a->pP
25d90 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c  ayload!=b->pPayl
25da0 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oad ) return 0;.
25db0 20 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c      if( a->nPayl
25dc0 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64  oad!=b->nPayload
25dd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25de0 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d   if( a->nLocal!=
25df0 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75  b->nLocal ) retu
25e00 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
25e10 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65  >nSize!=b->nSize
25e20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25e30 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
25e40 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
25e50 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
25e60 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
25e70 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
25e80 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
25e90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
25ea0 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
25eb0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
25ec0 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69  ge, pCur->ix, &i
25ed0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
25ee0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
25ef0 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69  cellInfoEqual(&i
25f00 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
25f10 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ) );.  }.#else. 
25f20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
25f30 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
25f40 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  f.static SQLITE_
25f50 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65  NOINLINE void ge
25f60 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
25f70 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
25f80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25f90 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  e==0 ){.    pCur
25fa0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
25fb0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
25fc0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
25fd0 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75  (pCur->pPage,pCu
25fe0 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66  r->ix,&pCur->inf
25ff0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
26000 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
26010 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
26020 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
26030 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
26040 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
26050 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
26060 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
26070 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
26080 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
26090 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
260a0 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
260b0 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
260c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
260d0 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
260e0 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
260f0 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
26100 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
26110 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
26120 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
26130 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
26140 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
26150 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
26160 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
26170 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
26180 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26190 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
261a0 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
261b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
261c0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
261d0 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  N(BtCursor *pCur
261e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
261f0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
26200 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26210 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a  URSOR_VALID;.}..
26220 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26230 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
26240 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f  teger key or "ro
26250 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65  wid" for a table
26260 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20   btree..** This 
26270 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
26280 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73  valid for a curs
26290 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
262a0 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72  ing into a.** or
262b0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72  dinary table btr
262c0 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ee.  If the curs
262d0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  or points to an 
262e0 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a  index btree or.*
262f0 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68  * is invalid, th
26300 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73  e result of this
26310 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65   routine is unde
26320 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  fined..*/.i64 sq
26330 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
26340 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  rKey(BtCursor *p
26350 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
26360 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26370 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
26380 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
26390 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
263a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
263b0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
263c0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
263d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
263e0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a  r->info.nKey;.}.
263f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
26400 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
26410 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75  _FUNC./*.** Retu
26420 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  rn the offset in
26430 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
26440 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61  file for the sta
26450 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79  rt of the.** pay
26460 6c 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68  load to which th
26470 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
26480 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ting..*/.i64 sql
26490 69 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28  ite3BtreeOffset(
264a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
264b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
264c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
264d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
264e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
264f0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
26500 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
26510 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29  ;.  return (i64)
26520 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
26530 69 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e  ize*((i64)pCur->
26540 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29  pPage->pgno - 1)
26550 20 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34   +.         (i64
26560 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  )(pCur->info.pPa
26570 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50  yload - pCur->pP
26580 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23  age->aData);.}.#
26590 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
265a0 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
265b0 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  L_FUNC */../*.**
265c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
265d0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
265e0 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65  ayload for the e
265f0 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
26600 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
26610 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72  ointing to.  For
26620 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74   table btrees, t
26630 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
26640 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74  amount.** of dat
26650 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74  a.  For index bt
26660 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
26670 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
26680 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
26690 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
266a0 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
266b0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
266c0 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
266d0 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
266e0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
266f0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
26700 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
26710 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
26720 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
26730 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
26740 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75  RSOR_VALID..*/.u
26750 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  32 sqlite3BtreeP
26760 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72  ayloadSize(BtCur
26770 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
26780 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26790 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
267a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
267b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
267c0 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
267d0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
267e0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
267f0 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a  .nPayload;.}../*
26800 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 75 70  .** Return an up
26810 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
26820 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 72 65 63   size of any rec
26830 6f 72 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ord for the tabl
26840 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
26850 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
26860 20 69 6e 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   into..**.** Thi
26870 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
26880 74 69 6f 6e 2e 20 20 45 76 65 72 79 74 68 69 6e  tion.  Everythin
26890 67 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72  g will still wor
268a0 6b 20 69 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  k if this.** rou
268b0 74 69 6e 65 20 61 6c 77 61 79 73 20 72 65 74 75  tine always retu
268c0 72 6e 73 20 32 31 34 37 34 38 33 36 34 37 20 28  rns 2147483647 (
268d0 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 61 72  which is the lar
268e0 67 65 73 74 20 72 65 63 6f 72 64 0a 2a 2a 20 74  gest record.** t
268f0 68 61 74 20 53 51 4c 69 74 65 20 63 61 6e 20 68  hat SQLite can h
26900 61 6e 64 6c 65 29 20 6f 72 20 6d 6f 72 65 2e 20  andle) or more. 
26910 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 20 61   But returning a
26920 20 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 20 6d   smaller value m
26930 69 67 68 74 0a 2a 2a 20 70 72 65 76 65 6e 74 20  ight.** prevent 
26940 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  large memory all
26950 6f 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 74 72  ocations when tr
26960 79 69 6e 67 20 74 6f 20 69 6e 74 65 72 70 72 65  ying to interpre
26970 74 20 61 0a 2a 2a 20 63 6f 72 72 75 70 74 20 64  t a.** corrupt d
26980 61 74 72 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  atrabase..**.** 
26990 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
269a0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 65 72 65 6c  ementation merel
269b0 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69  y returns the si
269c0 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  ze of the underl
269d0 79 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  ying.** database
269e0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   file..*/.sqlite
269f0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42  3_int64 sqlite3B
26a00 74 72 65 65 4d 61 78 52 65 63 6f 72 64 53 69 7a  treeMaxRecordSiz
26a10 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
26a20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
26a30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26a40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
26a50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26a60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26a70 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42   return pCur->pB
26a80 74 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  t->pageSize * (s
26a90 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 43 75  qlite3_int64)pCu
26aa0 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  r->pBt->nPage;.}
26ab0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
26ac0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
26ad0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26ae0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
26af0 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
26b00 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
26b10 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
26b20 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
26b30 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
26b40 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
26b50 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
26b60 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
26b70 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
26b80 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
26b90 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
26ba0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
26bb0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
26bc0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
26bd0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
26be0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
26bf0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26c00 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
26c10 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
26c20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
26c30 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
26c40 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
26c50 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
26c60 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
26c70 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
26c80 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
26c90 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
26ca0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
26cb0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
26cc0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
26cd0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
26ce0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
26cf0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
26d00 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
26d10 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
26d20 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
26d30 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
26d40 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
26d50 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
26d60 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
26d70 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
26d80 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
26d90 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
26da0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
26db0 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
26dc0 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
26dd0 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
26de0 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
26df0 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
26e00 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
26e10 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
26e20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
26e30 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
26e40 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
26e50 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
26e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26e70 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
26e80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
26e90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26ea0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
26eb0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
26ec0 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
26ed0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
26ee0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
26ef0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
26f00 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
26f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26f20 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
26f30 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
26f40 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
26f50 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
26f60 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
26f70 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
26f80 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
26f90 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
26fa0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
26fb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26fc0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
26fd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
26fe0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
26ff0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
27000 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
27010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27020 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
27030 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
27040 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
27050 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
27060 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
27070 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
27080 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
27090 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
270a0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
270b0 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
270c0 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
270d0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
270e0 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
270f0 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
27100 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
27110 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
27120 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
27130 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
27140 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
27150 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
27160 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
27170 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
27180 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
27190 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
271a0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
271b0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
271c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
271d0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
271e0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
271f0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
27200 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
27210 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
27220 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
27230 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
27240 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
27250 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
27260 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
27270 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27280 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
27290 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
272a0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
272b0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
272c0 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
272d0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
272e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
272f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
27300 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
27310 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
27320 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
27340 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
27350 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
27360 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
27370 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
27380 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
27390 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
273a0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
273b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
273c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
273d0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
273e0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
273f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
27400 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
27410 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
27420 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
27430 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
27440 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
27450 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
27460 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
27470 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
27480 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
27490 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
274a0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
274b0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
274c0 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
274d0 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
274e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
274f0 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
27500 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
27510 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
27520 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
27530 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
27540 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
27550 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
27560 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
27570 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
27580 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
27590 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
275a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
275b0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
275c0 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
275d0 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
275e0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
275f0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
27600 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
27610 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
27620 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
27630 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
27640 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
27650 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27660 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
27670 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
27680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
27690 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
276a0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
276b0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
276c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
276d0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
276e0 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
276f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27700 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
27710 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27730 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
27740 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
27750 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
27760 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
27770 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
27780 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
27790 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
277a0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
277b0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
277c0 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
277d0 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
277e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
277f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27800 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
27810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27820 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
27830 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
27840 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
27850 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
27860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
27870 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
27880 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
27890 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
278a0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
278b0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
278c0 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
278d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
278e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
278f0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
27900 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
27910 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
27920 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
27930 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
27940 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
27950 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
27960 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
27970 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
27980 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
27990 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
279a0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
279b0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
279c0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
279d0 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
279e0 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
279f0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
27a00 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
27a10 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
27a20 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
27a30 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
27a40 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
27a50 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
27a60 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
27a70 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
27a80 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
27a90 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
27aa0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
27ab0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
27ac0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
27ad0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
27ae0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
27af0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
27b00 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
27b10 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
27b20 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
27b30 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69  low pages.** thi
27b40 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
27b50 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
27b60 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
27b70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65  ulate.** the ove
27b80 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
27b90 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
27ba0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
27bb0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
27bc0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
27bd0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
27be0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
27bf0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
27c00 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
27c10 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
27c20 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
27c30 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
27c40 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
27c50 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
27c60 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
27c70 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
27c80 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
27c90 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
27ca0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
27cb0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
27cc0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
27cd0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
27ce0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
27cf0 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
27d00 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
27d10 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27d20 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
27d30 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
27d40 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
27d50 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
27d60 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
27d70 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
27d80 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
27d90 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
27da0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
27db0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
27dc0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
27dd0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
27de0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
27df0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
27e00 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
27e10 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
27e20 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
27e30 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
27e40 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
27e50 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
27e60 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
27e70 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
27e80 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
27e90 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
27ea0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
27eb0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
27ec0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
27ed0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
27ee0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
27ef0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
27f00 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
27f10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
27f20 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
27f30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27f40 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
27f50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
27f60 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20  pCur->pPage;    
27f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
27f80 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
27f90 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
27fa0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27fb0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
27fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
27fd0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
27fe0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
27ff0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
28000 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
28010 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
28020 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
28030 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f  rt = pBuf;     /
28040 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69  * Start of origi
28050 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a  nal out buffer *
28060 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
28070 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
28080 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c  ssert( eOp==0 ||
28090 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73   eOp==1 );.  ass
280a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
280b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
280c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
280d0 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65  r->ix<pPage->nCe
280e0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
280f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28100 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
28110 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
28120 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
28130 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28140 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
28150 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
28160 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
28170 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79  ..  assert( aPay
28180 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44  load > pPage->aD
28190 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70  ata );.  if( (up
281a0 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70  tr)(aPayload - p
281b0 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28  Page->aData) > (
281c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
281d0 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  - pCur->info.nLo
281e0 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
281f0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
28200 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
28210 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
28220 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  is an error.  Th
28230 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69  e.    ** conditi
28240 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65  onal above is re
28250 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ally:.    **    
28260 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
28270 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
28280 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
28290 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
282a0 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61    ** but is reca
282b0 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72  st into its curr
282c0 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69  ent form to avoi
282d0 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  d integer overfl
282e0 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20  ow problems.    
282f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
28300 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
28310 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  E(pPage);.  }.. 
28320 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
28330 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
28340 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
28350 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
28360 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
28370 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
28380 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
28390 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
283a0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
283b0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
283c0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
283d0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
283e0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
283f0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
28400 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
28410 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
28420 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
28430 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
28440 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
28450 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
28460 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
28470 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
28480 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
28490 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
284a0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
284b0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
284c0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
284d0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
284e0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
284f0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
28500 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
28510 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
28520 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
28530 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
28540 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
28550 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
28560 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
28570 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
28580 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
28590 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
285a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
285b0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
285c0 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
285d0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
285e0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
285f0 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
28600 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
28610 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
28620 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
28630 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
28640 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
28650 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
28660 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
28670 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
28680 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
28690 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
286a0 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
286b0 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
286c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
286d0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
286e0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
286f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
28700 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
28710 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
28720 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
28730 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
28740 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
28750 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d  pCur->aOverflow=
28760 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76  =0.       || nOv
28770 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50  fl*(int)sizeof(P
28780 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61  gno) > sqlite3Ma
28790 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61  llocSize(pCur->a
287a0 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20  Overflow).      
287b0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
287c0 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
287d0 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
287e0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
287f0 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
28800 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
28810 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28820 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
28830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
28840 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28850 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
28860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28870 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
28880 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
28890 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
288a0 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
288b0 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
288c0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
288d0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
288e0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
288f0 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73  idOvfl;.    }els
28900 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
28910 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
28920 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
28930 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
28940 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
28950 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
28960 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
28970 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
28980 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20  lid, skip.      
28990 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
289a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
289b0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
289c0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
289d0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
289e0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
289f0 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
28a00 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
28a10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28a20 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66  Idx];.        of
28a30 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
28a40 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
28a50 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
28a60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
28a70 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20  OK && amt>0 );. 
28a80 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61     while( nextPa
28a90 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ge ){.      /* I
28aa0 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
28ab0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
28ac0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
28ad0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
28ae0 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt( pCur->aOverf
28af0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20  low[iIdx]==0.   
28b00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
28b10 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
28b20 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20  dx]==nextPage.  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
28b40 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
28b50 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
28b60 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
28b70 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  age;..      if( 
28b80 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
28b90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
28ba0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
28bb0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
28bc0 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
28bd0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
28be0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
28bf0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
28c00 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
28c10 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
28c20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
28c30 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
28c40 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
28c50 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
28c60 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
28c70 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
28c80 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
28c90 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
28ca0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
28cb0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
28cc0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
28cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28ce0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
28cf0 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
28d00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28d10 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
28d20 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
28d30 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
28d40 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
28d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
28d60 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
28d70 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
28d80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
28d90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
28da0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
28db0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
28dc0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
28dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
28de0 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
28df0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
28e00 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
28e10 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
28e20 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
28e30 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
28e40 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
28e50 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
28e60 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
28e70 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
28e80 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
28e90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28ea0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
28eb0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
28ec0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
28ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
28ee0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
28ef0 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
28f00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
28f10 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
28f20 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
28f30 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
28f40 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
28f50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28f60 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
28f70 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
28f80 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
28f90 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
28fa0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
28fb0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
28fc0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
28fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
28fe0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
28ff0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
29000 20 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20 20   page-cache.    
29010 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20      **   4) the 
29020 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
29030 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
29040 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
29050 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
29060 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20  the WAL file.   
29070 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20       **   6) at 
29080 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
29090 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
290a0 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
290b0 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
290c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
290d0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
290e0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
290f0 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
29100 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
29110 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
29120 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
29130 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
29140 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
29150 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
29160 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
29170 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
29180 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
29190 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
291a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
291b0 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
291f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
29200 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
29240 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
29250 50 61 67 65 72 44 69 72 65 63 74 52 65 61 64 4f  PagerDirectReadO
29260 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  k(pBt->pPager, n
29270 65 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20 28  extPage)    /* (
29280 33 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20  3,4,5) */.      
29290 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
292a0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
292d0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
292e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
292f0 66 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69 74  file *fd = sqlit
29300 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
29310 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
29320 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
29330 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
29340 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
29350 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
29360 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
29370 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
29380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29390 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20    /* due to (6) 
293a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
293b0 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
293c0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
293d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
293e0 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
293f0 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
29400 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
29410 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
29420 20 69 66 28 20 72 63 20 26 26 20 6e 65 78 74 50   if( rc && nextP
29430 61 67 65 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29  age>pBt->nPage )
29440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
29450 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
29460 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
29470 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
29480 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
29490 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
294a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
294b0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
294c0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
294d0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
294e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
294f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
29500 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
29510 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
29520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
29530 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  eOp==0 ? PAGER_G
29540 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
29550 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
29560 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29580 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
29590 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
295a0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
295b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
295c0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
295d0 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
295e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
295f0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
29600 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
29610 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
29620 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29630 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
29640 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
29650 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
29660 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
29670 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29680 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
29690 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d         if( amt==
296a0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
296b0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
296c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
296d0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
296e0 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20        iIdx++;.  
296f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
29700 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29710 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  amt>0 ){.    /* 
29720 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65  Overflow chain e
29730 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20  nds prematurely 
29740 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
29750 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
29760 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
29770 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29780 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
29790 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
297a0 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
297b0 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
297c0 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
297d0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
297e0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
297f0 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
29800 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
29810 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
29820 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
29830 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
29840 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
29850 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
29860 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
29870 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
29880 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
29890 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
298a0 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
298b0 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
298c0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
298d0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
298e0 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
298f0 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
29900 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
29910 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
29920 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
29930 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
29940 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
29950 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
29960 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
29970 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29980 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
29990 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
299a0 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
299b0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
299c0 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
299d0 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
299e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
299f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
29a00 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
29a10 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
29a20 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
29a30 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
29a40 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
29a50 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
29a60 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
29a70 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
29a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
29a90 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
29aa0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
29ab0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
29ac0 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
29ad0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
29ae0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
29af0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29b00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29b20 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
29b30 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
29b40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
29b50 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
29b60 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
29b70 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
29b80 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
29b90 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
29ba0 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
29bb0 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74  .** This variant
29bc0 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
29bd0 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20  Payload() works 
29be0 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73  even if the curs
29bf0 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e  or has not.** in
29c00 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49   the CURSOR_VALI
29c10 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20  D state.  It is 
29c20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
29c30 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
29c40 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ad().** interfac
29c50 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
29c60 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
29c70 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  OB.static SQLITE
29c80 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63  _NOINLINE int ac
29c90 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
29ca0 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
29cb0 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73  pCur,.  u32 offs
29cc0 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20  et,.  u32 amt,. 
29cd0 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20   void *pBuf.){. 
29ce0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20   int rc;.  if ( 
29cf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29d00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
29d10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29d20 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61  E_ABORT;.  }.  a
29d30 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29d40 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29d50 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52  );.  rc = btreeR
29d60 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
29d70 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65  tion(pCur);.  re
29d80 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61  turn rc ? rc : a
29d90 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
29da0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
29db0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  pBuf, 0);.}.int 
29dc0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29dd0 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72  oadChecked(BtCur
29de0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
29df0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
29e00 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
29e10 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29e20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
29e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72  .    assert( cur
29e40 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29e50 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74  pCur) );.    ret
29e60 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
29e70 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
29e80 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
29e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29ea0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
29eb0 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66  Checked(pCur, of
29ec0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29  fset, amt, pBuf)
29ed0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
29ee0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
29ef0 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
29f00 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
29f10 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
29f20 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
29f30 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
29f40 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
29f50 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
29f60 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
29f70 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
29f80 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
29f90 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
29fa0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
29fb0 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
29fc0 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
29fd0 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
29fe0 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
29ff0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2a000 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
2a010 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
2a020 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
2a030 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
2a040 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
2a050 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
2a060 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
2a070 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
2a080 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
2a090 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
2a0a0 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
2a0b0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
2a0c0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
2a0d0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
2a0e0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
2a0f0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
2a100 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
2a110 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
2a120 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
2a130 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
2a140 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
2a150 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
2a160 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
2a170 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
2a180 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
2a190 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2a1a0 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
2a1b0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
2a1c0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
2a1d0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
2a1e0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
2a1f0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
2a200 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
2a210 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
2a220 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
2a230 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
2a240 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
2a250 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
2a260 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
2a270 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
2a280 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
2a290 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
2a2a0 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
2a2b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
2a2c0 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
2a2d0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
2a2e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2a2f0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2a300 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
2a310 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
2a320 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
2a330 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2a340 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2a350 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2a360 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2a370 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
2a380 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
2a390 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
2a3a0 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73 73  r->pPage);.  ass
2a3b0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2a3c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2a3d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2a3e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a3f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2a400 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2a410 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a420 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a440 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2a450 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
2a460 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2a470 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
2a480 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2a490 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70  pPayload>pCur->p
2a4a0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43  Page->aData || C
2a4b0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
2a4c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a4d0 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
2a4e0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2a4f0 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
2a500 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e    amt = pCur->in
2a510 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28  fo.nLocal;.  if(
2a520 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72 2d   amt>(int)(pCur-
2a530 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2a540 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
2a550 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f  ayload) ){.    /
2a560 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20 6c  * There is too l
2a570 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20 74  ittle space on t
2a580 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  he page for the 
2a590 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a  expected amount.
2a5a0 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20      ** of local 
2a5b0 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61 73  content. Databas
2a5c0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2a5d0 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
2a5e0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  ( CORRUPT_DB );.
2a5f0 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c      amt = MAX(0,
2a600 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61   (int)(pCur->pPa
2a610 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
2a620 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2a630 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ad));.  }.  *pAm
2a640 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20 20  t = (u32)amt;.  
2a650 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
2a660 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a670 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
2a680 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
2a690 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
2a6a0 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
2a6b0 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
2a6c0 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
2a6d0 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
2a6e0 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
2a6f0 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
2a700 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
2a710 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
2a720 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
2a730 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
2a740 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
2a750 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
2a760 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
2a770 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
2a780 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
2a790 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
2a7a0 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
2a7b0 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
2a7c0 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
2a7d0 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
2a7e0 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
2a7f0 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
2a800 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
2a810 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
2a820 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
2a830 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
2a840 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2a850 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
2a860 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
2a870 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
2a880 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
2a890 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
2a8a0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2a8b0 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
2a8c0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
2a8d0 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42  eePayloadFetch(B
2a8e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2a8f0 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
2a900 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
2a910 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
2a920 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2a930 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2a940 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2a950 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
2a960 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
2a970 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
2a980 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2a990 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
2a9a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a9b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
2a9c0 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
2a9d0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2a9e0 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
2a9f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
2aa00 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
2aa10 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
2aa20 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
2aa30 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
2aa40 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
2aa50 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
2aa60 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
2aa70 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
2aa80 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
2aa90 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
2aaa0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
2aab0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
2aac0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2aad0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
2aae0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2aaf0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2ab00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2ab10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2ab20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2ab30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2ab40 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
2ab50 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
2ab60 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2ab70 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2ab80 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
2ab90 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
2aba0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2abb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2abc0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
2abd0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2abe0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2abf0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2ac00 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2ac10 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  l);.  pCur->aiId
2ac20 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2ac30 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
2ac40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ac50 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70  iPage] = pCur->p
2ac60 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78  Page;.  pCur->ix
2ac70 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
2ac80 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  age++;.  return 
2ac90 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2aca0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
2acb0 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2c  ur->pPage, pCur,
2acc0 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
2acd0 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  lags);.}..#ifdef
2ace0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2acf0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
2ad00 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
2ad10 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
2ad20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
2ad30 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
2ad40 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
2ad50 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
2ad60 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
2ad70 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
2ad80 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
2ad90 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
2ada0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
2adb0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
2adc0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2add0 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
2ade0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
2adf0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
2ae00 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
2ae10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2ae20 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
2ae30 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2ae40 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
2ae50 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
2ae60 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
2ae70 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
2ae80 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
2ae90 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
2aea0 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aec0 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
2aed0 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
2aee0 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
2aef0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
2af00 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
2af10 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2af20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2af30 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2af40 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2af50 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
2af60 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
2af70 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2af80 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
2af90 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
2afa0 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
2afb0 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
2afc0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
2afd0 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
2afe0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2aff0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
2b000 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
2b010 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
2b020 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
2b030 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
2b040 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
2b050 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
2b060 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2b070 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
2b080 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
2b090 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2b0a0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
2b0b0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
2b0c0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
2b0d0 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
2b0e0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
2b0f0 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
2b100 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
2b110 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2b120 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28  pLeaf;.  assert(
2b130 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2b140 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2b150 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b170 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2b180 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
2b190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b1a0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
2b1b0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
2b1c0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2b1d0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
2b1e0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b1f0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2b200 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
2b210 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
2b220 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
2b230 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2b240 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
2b250 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
2b260 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
2b270 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2b280 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2b290 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2b2a0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2b2b0 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
2b2c0 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  >ix = pCur->aiId
2b2d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2b2e0 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72  ;.  pLeaf = pCur
2b2f0 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2b300 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
2b310 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50  pPage[--pCur->iP
2b320 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50  age];.  releaseP
2b330 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66  ageNotNull(pLeaf
2b340 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
2b350 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
2b360 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
2b370 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
2b380 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
2b390 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
2b3a0 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
2b3b0 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
2b3c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
2b3d0 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
2b3e0 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
2b3f0 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
2b400 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
2b410 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
2b420 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
2b430 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
2b440 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
2b450 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
2b460 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
2b470 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
2b480 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
2b490 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
2b4a0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2b4b0 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
2b4c0 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
2b4d0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
2b4e0 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
2b4f0 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
2b500 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
2b510 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  D and this routi
2b520 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
2b530 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69  E_EMPTY. Otherwi
2b540 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  se,.** the curso
2b550 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
2b560 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  t to the first c
2b570 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
2b580 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76  he root.** (or v
2b590 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
2b5a0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
2b5b0 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2b5c0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
2b5d0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
2b5e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
2b5f0 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
2b600 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
2b610 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
2b620 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
2b630 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
2b640 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
2b650 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
2b660 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
2b670 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
2b680 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
2b690 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
2b6a0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
2b6b0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2b6c0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
2b6d0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
2b6e0 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
2b6f0 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
2b700 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
2b710 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
2b720 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
2b730 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
2b740 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2b750 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2b760 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
2b770 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
2b780 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
2b790 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2b7a0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
2b7b0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2b7c0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
2b7d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b7e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b7f0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2b800 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2b810 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
2b820 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2b830 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2b840 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
2b850 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2b860 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2b870 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
2b880 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
2b890 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2b8a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b8b0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2b8c0 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69  ESEEK || pCur->i
2b8d0 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65  Page<0 );.  asse
2b8e0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2b8f0 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  ot>0 || pCur->iP
2b900 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20  age<0 );..  if( 
2b910 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2b920 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2b930 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72  iPage ){.      r
2b940 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2b950 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  l(pCur->pPage);.
2b960 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70        while( --p
2b970 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
2b980 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b990 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
2b9a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2b9b0 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e]);.      }.   
2b9c0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
2b9d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2b9e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69  ;.      goto ski
2b9f0 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20  p_init;.    }.  
2ba00 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
2ba10 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
2ba20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2ba30 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2ba40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ba50 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c  ITE_EMPTY;.  }el
2ba60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2ba70 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
2ba80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ) );.    if( pCu
2ba90 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2baa0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
2bab0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2bac0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2bad0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20  FAULT ){.       
2bae0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2baf0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
2bb00 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  OK );.        re
2bb10 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
2bb20 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2bb30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
2bb40 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2bb50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2bb60 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2bb70 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2bb80 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2bb90 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
2bba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bbb0 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
2bbc0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
2bbd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2bbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bbf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2bc00 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2bc10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bc20 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2bc30 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
2bc40 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2bc50 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  = pCur->pPage->i
2bc60 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
2bc70 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2bc80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
2bc90 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
2bca0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
2bcb0 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
2bcc0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
2bcd0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
2bce0 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
2bcf0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
2bd00 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
2bd10 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
2bd20 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
2bd30 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
2bd40 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
2bd50 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
2bd60 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
2bd70 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2bd80 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
2bd90 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
2bda0 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
2bdb0 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
2bdc0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2bdd0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2bde0 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
2bdf0 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
2be00 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
2be10 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2be20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2be30 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
2be40 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
2be50 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
2be60 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
2be70 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2be80 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
2be90 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
2bea0 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
2beb0 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
2bec0 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
2bed0 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
2bee0 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
2bef0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
2bf00 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
2bf10 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2bf20 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
2bf30 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
2bf40 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2bf50 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
2bf60 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2bf70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2bf80 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29  AGE(pCur->pPage)
2bf90 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74  ;.  }..skip_init
2bfa0 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  :  .  pCur->ix =
2bfb0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
2bfc0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2bfd0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2bfe0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2bff0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2c000 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
2c010 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2c020 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
2c030 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
2c040 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2c050 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2c060 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
2c070 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
2c080 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
2c090 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
2c0a0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
2c0b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2c0c0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
2c0d0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
2c0e0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
2c0f0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2c100 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2c110 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2c120 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2c130 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
2c140 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c150 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2c160 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2c170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2c180 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  MPTY;.  }.  retu
2c190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c1a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c1b0 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2c1c0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2c1d0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2c1e0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2c1f0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2c200 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2c210 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2c220 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2c230 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2c240 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2c250 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2c260 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2c270 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2c280 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2c290 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2c2a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c2b0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2c2c0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2c2d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c2e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c2f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c300 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c310 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2c320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c330 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2c340 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2c350 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2c360 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2c370 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
2c380 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2c390 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2c3a0 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >ix));.    rc = 
2c3b0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2c3c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
2c3d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c3e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2c3f0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
2c400 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
2c410 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2c420 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
2c430 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2c440 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
2c450 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
2c460 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
2c470 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
2c480 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
2c490 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
2c4a0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2c4b0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
2c4c0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2c4d0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
2c4e0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c4f0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2c500 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2c510 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
2c520 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
2c530 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2c540 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2c550 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2c560 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
2c570 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
2c580 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2c590 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
2c5a0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2c5b0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2c5c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c5d0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2c5e0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
2c5f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2c600 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2c610 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2c620 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2c630 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2c640 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
2c650 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2c660 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2c670 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2c680 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2c690 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2c6a0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2c6b0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2c6c0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2c6d0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2c6e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2c6f0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2c700 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2c710 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2c720 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2c730 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2c740 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2c750 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2c760 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2c770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c780 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2c790 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2c7a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2c7b0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2c7c0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2c7d0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2c7e0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2c7f0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2c800 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2c810 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2c820 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2c830 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2c840 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2c850 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2c860 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2c870 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2c880 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2c890 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2c8a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2c8b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c8c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2c8d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2c8e0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2c8f0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2c900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2c910 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2c920 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2c930 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c940 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
2c950 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2c960 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2c970 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2c980 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2c990 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2c9a0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c9b0 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2c9c0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2c9d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2c9e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c9f0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2ca00 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2ca10 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
2ca20 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2ca30 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
2ca40 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
2ca50 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2ca60 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2ca70 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2ca80 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2ca90 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2caa0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2cab0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2cac0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2cad0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2cae0 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
2caf0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2cb00 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2cb10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2cb20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2cb30 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2cb40 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2cb50 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2cb60 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2cb70 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2cb80 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2cb90 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2cba0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2cbb0 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2cbc0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2cbd0 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2cbe0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2cbf0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2cc00 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2cc10 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2cc20 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2cc30 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2cc40 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2cc50 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2cc60 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2cc70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2cc80 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2cc90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cca0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2ccb0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2ccc0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2ccd0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2cce0 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70  Cur->ix==pCur->p
2ccf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  Page->nCell-1 );
2cd00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2cd10 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  r->pPage->leaf )
2cd20 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2a 70 52  ;.#endif.    *pR
2cd30 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
2cd40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cd50 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2cd60 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2cd70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cd80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2cd90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2cda0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2cdb0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2cdc0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2cdd0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2cde0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cdf0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2ce00 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2ce10 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65  F_AtLast;.    }e
2ce20 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
2ce30 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2ce40 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d  CF_AtLast;.    }
2ce50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2ce60 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2ce70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2ce80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2ce90 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2cea0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
2ceb0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  pRes = 1;.    rc
2cec0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ced0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2cee0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2cef0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
2cf00 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
2cf10 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
2cf20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
2cf30 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
2cf40 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
2cf50 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
2cf60 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
2cf70 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
2cf80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
2cf90 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
2cfa0 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
2cfb0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2cfc0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
2cfd0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
2cfe0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
2cff0 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
2d000 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
2d010 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
2d020 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
2d030 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2d040 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
2d050 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
2d060 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
2d070 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
2d080 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
2d090 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
2d0a0 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
2d0b0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
2d0c0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
2d0d0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
2d0e0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
2d0f0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
2d100 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
2d110 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
2d120 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
2d130 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
2d140 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
2d150 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
2d160 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
2d170 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
2d180 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
2d190 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2d1a0 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
2d1b0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2d1c0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2d1d0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2d1e0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
2d1f0 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
2d200 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
2d210 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2d220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2d230 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
2d240 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
2d250 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
2d260 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
2d270 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
2d280 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2d290 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2d2a0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2c0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2d2d0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2d2e0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
2d2f0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2d300 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2d310 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2d320 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2d330 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
2d340 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2d350 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  dxKey..**.** For
2d360 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74   index tables, t
2d370 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65  he pIdxKey->eqSe
2d380 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  en field is set 
2d390 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a  to 1 if there.**
2d3a0 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79   exists an entry
2d3b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2d3c0 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  at exactly match
2d3d0 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f  es pIdxKey.  .*/
2d3e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2d3f0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
2d400 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2d410 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
2d420 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
2d430 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
2d440 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
2d450 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
2d460 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
2d470 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
2d480 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2d490 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
2d4a0 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
2d4b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2d4c0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
2d4d0 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
2d4e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
2d4f0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2d500 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
2d510 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2d520 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2d530 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52  RecordCompare xR
2d540 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20  ecordCompare;.. 
2d550 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2d560 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2d570 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2d580 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d590 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2d5a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2d5b0 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
2d5c0 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
2d5d0 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
2d5e0 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20  KeyInfo==0) );. 
2d5f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d600 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d610 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d  LID || (pIdxKey=
2d620 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49  =0)==(pCur->curI
2d630 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20  ntKey!=0) );..  
2d640 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2d650 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
2d660 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
2d670 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
2d680 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
2d690 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
2d6a0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2d6b0 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
2d6c0 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20  if( pIdxKey==0. 
2d6d0 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
2d6e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2d6f0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2d700 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2d710 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  Key)!=0.  ){.   
2d720 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2d730 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2d740 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2d750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d760 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2d770 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2d780 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
2d790 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72  .      if( (pCur
2d7a0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2d7b0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
2d7c0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2d7d0 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  -1;.        retu
2d7e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49      }.      /* I
2d800 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
2d810 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20  key is one more 
2d820 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
2d830 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20  s key, then.    
2d840 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20    ** try to get 
2d850 74 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69  there using sqli
2d860 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 72  te3BtreeNext() r
2d870 61 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c  ather than a ful
2d880 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72  l.      ** binar
2d890 79 20 73 65 61 72 63 68 2e 20 20 54 68 69 73 20  y search.  This 
2d8a0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2d8b0 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  on only.  The co
2d8c0 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20  rrect answer.   
2d8d0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f     ** is still o
2d8e0 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
2d8f0 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20  this case, only 
2d900 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c  a little more sl
2d910 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69  owely */.      i
2d920 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2d930 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  ey+1==intKey ){.
2d940 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2d950 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2d960 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2d970 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  (pCur, 0);.     
2d980 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d9a0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
2d9b0 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ur);.          i
2d9c0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2d9d0 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2d9e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d9f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2da00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2da10 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2da20 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
2da30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2da40 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
2da50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2da60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2da70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2da80 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
2da90 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
2daa0 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
2dab0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
2dac0 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
2dad0 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
2dae0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
2daf0 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
2db00 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
2db10 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2db20 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
2db30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2db40 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2db50 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
2db60 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
2db70 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
2db80 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
2db90 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
2dba0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2dbb0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2dbc0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
2dbd0 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2dbe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2dbf0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2dc00 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2dc10 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
2dc20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2dc30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2dc40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
2dc50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2dc60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2dc70 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
2dc80 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73   pCur->pPage->is
2dc90 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
2dca0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2dcb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2dcc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dcd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30  pPage->nCell > 0
2dce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2dcf0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20  ur->iPage==0 || 
2dd00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2dd10 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63  >intKey==pCur->c
2dd20 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73  urIntKey );.  as
2dd30 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
2dd40 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
2dd50 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
2dd60 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
2dd70 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
2dd80 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
2dd90 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2dda0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
2ddb0 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddd0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2dde0 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
2ddf0 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
2de00 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
2de10 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
2de20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
2de30 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
2de40 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
2de50 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
2de60 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
2de70 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
2de80 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
2de90 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
2dea0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
2deb0 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
2dec0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
2ded0 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
2dee0 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2def0 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
2df00 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
2df10 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
2df20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
2df30 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
2df40 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
2df50 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
2df60 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
2df70 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
2df80 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
2df90 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
2dfa0 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
2dfb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2dfc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2dfd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2dfe0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
2dff0 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
2e000 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
2e010 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
2e020 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  1;.    assert( b
2e030 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62  iasRight==0 || b
2e040 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20  iasRight==1 );. 
2e050 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31     idx = upr>>(1
2e060 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20  -biasRight); /* 
2e070 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20  idx = biasRight 
2e080 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72  ? upr : (lwr+upr
2e090 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72  )/2; */.    pCur
2e0a0 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2e0b0 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64  .    if( xRecord
2e0c0 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20  Compare==0 ){.  
2e0d0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2e0e0 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
2e0f0 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
2e100 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2e110 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2e120 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2e130 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b  e->intKeyLeaf ){
2e140 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2e150 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
2e160 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
2e170 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
2e180 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2e190 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2e1b0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
2e1c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2e1d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
2e1f0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
2e200 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
2e210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2e220 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
2e230 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2e240 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2e250 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2e260 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
2e270 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2e280 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
2e290 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2e2a0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2e2b0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2e2c0 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
2e2d0 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2e2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e2f0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
2e300 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
2e310 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2e320 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2e330 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2e340 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2e350 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
2e360 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2e370 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
2e380 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
2e390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e3a0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2e3b0 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
2e3c0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2e3d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
2e3e0 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
2e3f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2e400 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2e410 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2e420 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2e430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e440 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2e450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e460 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2e470 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2e480 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2e490 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2e4a0 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2e4b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2e4c0 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2e4d0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2e4e0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2e4f0 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2e500 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2e510 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2e520 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2e530 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2e540 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2e550 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2e560 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2e570 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2e580 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2e590 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2e5a0 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2e5b0 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2e5c0 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2e5d0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2e5e0 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2e5f0 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2e600 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2e610 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2e620 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2e630 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2e640 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2e650 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2e660 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2e670 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2e680 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2e690 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2e6a0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2e6b0 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2e6c0 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2e6d0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2e6e0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2e6f0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2e700 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2e710 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e720 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2e730 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2e740 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2e750 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2e760 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2e770 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2e780 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2e790 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2e7a0 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2e7b0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2e7c0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2e7d0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2e7e0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2e7f0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2e800 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2e810 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2e820 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2e830 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2e840 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2e850 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2e860 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2e870 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2e880 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2e890 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2e8a0 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2e8b0 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2e8c0 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2e8d0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2e8e0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2e8f0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2e900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2e910 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2e920 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2e930 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2e940 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2e950 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2e960 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2e970 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2e980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2e990 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2e9a0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2e9b0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2e9c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2e9d0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2e9e0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2e9f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ea00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ea10 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2ea20 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2ea30 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2ea40 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2ea50 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2ea60 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2ea70 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2ea80 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2ea90 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2eaa0 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2eab0 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2eac0 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2ead0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2eae0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2eaf0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2eb00 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2eb10 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2eb20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2eb30 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2eb40 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2eb50 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2eb60 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2eb70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2eb80 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2eb90 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2eba0 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2ebb0 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2ebc0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2ebd0 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2ebe0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2ebf0 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2ec00 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2ec10 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2ec20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2ec30 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2ec40 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2ec50 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2ec60 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2ec70 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2ec80 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e       const int n
2ec90 4f 76 65 72 72 75 6e 20 3d 20 31 38 3b 20 20 2f  Overrun = 18;  /
2eca0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 76  * Size of the ov
2ecb0 65 72 72 75 6e 20 70 61 64 64 69 6e 67 20 2a 2f  errun padding */
2ecc0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2ecd0 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
2ece0 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
2ecf0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
2ed00 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
2ed10 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
2ed20 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Key;.          t
2ed30 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30  estcase( nCell<0
2ed40 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66   );   /* True if
2ed50 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33   key size is 2^3
2ed60 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20  2 or more */.   
2ed70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ed80 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a   nCell==0 );  /*
2ed90 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2eda0 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2edb0 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  00 */.          
2edc0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2edd0 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =1 );  /* Invali
2ede0 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2edf0 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20  0 0x80 0x01 */. 
2ee00 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2ee10 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20  e( nCell==2 );  
2ee20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c  /* Minimum legal
2ee30 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20   index key size 
2ee40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2ee50 20 6e 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c   nCell<2 || nCel
2ee60 6c 2f 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61  l/pCur->pBt->usa
2ee70 62 6c 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42  bleSize>pCur->pB
2ee80 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  t->nPage ){.    
2ee90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2eea0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
2eeb0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2eec0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2eed0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2eee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2eef0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2ef00 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 6e  3Malloc( nCell+n
2ef10 4f 76 65 72 72 75 6e 20 29 3b 0a 20 20 20 20 20  Overrun );.     
2ef20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2ef30 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2ef40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ef50 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2ef60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2ef70 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2ef80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ef90 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2efa0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2efb0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
2efc0 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
2efd0 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
2efe0 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29  ar*)pCellKey, 0)
2eff0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  ;.          mems
2f000 65 74 28 28 28 75 38 2a 29 70 43 65 6c 6c 4b 65  et(((u8*)pCellKe
2f010 79 29 2b 6e 43 65 6c 6c 2c 30 2c 6e 4f 76 65 72  y)+nCell,0,nOver
2f020 72 75 6e 29 3b 20 2f 2a 20 46 69 78 20 75 6e 69  run); /* Fix uni
2f030 6e 69 74 20 77 61 72 6e 69 6e 67 73 20 2a 2f 0a  nit warnings */.
2f040 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2f050 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2f060 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
2f070 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2f080 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2f090 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2f0a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
2f0b0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2f0c0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2f0d0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
2f0e0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
2f0f0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2f100 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2f110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2f120 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2f130 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2f140 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2f150 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2f160 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2f170 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2f180 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2f190 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2f1a0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2f1b0 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2f1c0 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2f1d0 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2f1e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2f1f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2f200 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2f210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2f220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2f230 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2f240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f250 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2f260 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2f270 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2f280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f290 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2f2a0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2f2b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f2c0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2f2d0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2f2e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f2f0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2f300 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2f310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2f320 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2f330 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f340 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2f350 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2f360 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2f370 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2f380 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2f390 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2f3a0 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2f3b0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2f3c0 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2f3d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f3e0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2f3f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2f400 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f410 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2f420 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2f430 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20  .      pCur->ix 
2f440 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2f450 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2f460 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f470 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2f480 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2f490 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2f4a0 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2f4b0 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2f4c0 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2f4d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f4e0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2f4f0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2f500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f510 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2f520 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2f530 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2f540 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2f550 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2f560 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2f570 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2f580 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2f590 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2f5a0 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2f5b0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73  nSize = 0;.  ass
2f5c0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2f5d0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2f5e0 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72  dOvfl)==0 );.  r
2f5f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f600 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2f610 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2f620 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2f630 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2f640 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2f650 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2f660 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2f670 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2f680 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2f690 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2f6a0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2f6b0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2f6c0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2f6d0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2f6e0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2f6f0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2f700 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2f710 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2f720 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2f730 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2f740 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2f750 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2f760 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f770 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2f780 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2f790 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2f7a0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2f7b0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2f7c0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2f7d0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2f7e0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2f7f0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2f800 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2f810 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2f820 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2f830 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
2f840 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20  stimate for the 
2f850 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2f860 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2f870 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e   pCur is.** poin
2f880 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e  ting to.  Return
2f890 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2f8a0 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74  er if no estimat
2f8b0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a  e is currently .
2f8c0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  ** available..*/
2f8d0 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
2f8e0 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43  eRowCountEst(BtC
2f8f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2f900 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a  i64 n;.  u8 i;..
2f910 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f920 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f930 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f940 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f950 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2f960 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2f970 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74    /* Currently t
2f980 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
2f990 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
2f9a0 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72  the OP_IfSmaller
2f9b0 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e  .  ** opcode, an
2f9c0 64 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74  d it that case t
2f9d0 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61  he cursor will a
2f9e0 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61  lways be valid a
2f9f0 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77  nd.  ** will alw
2fa00 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c  ays point to a l
2fa10 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69  eaf node. */.  i
2fa20 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  f( NEVER(pCur->e
2fa30 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2fa40 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31  LID) ) return -1
2fa50 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
2fa60 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
2fa70 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  =0) ) return -1;
2fa80 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50  ..  n = pCur->pP
2fa90 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f  age->nCell;.  fo
2faa0 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69  r(i=0; i<pCur->i
2fab0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2fac0 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  n *= pCur->apPag
2fad0 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d  e[i]->nCell;.  }
2fae0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
2faf0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2fb00 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2fb10 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2fb20 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20  e database. .** 
2fb30 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a  Return value:.**
2fb40 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  .**    SQLITE_OK
2fb50 20 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a          success.
2fb60 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  **    SQLITE_DON
2fb70 45 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73  E      cursor is
2fb80 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2fb90 67 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c  g at the last el
2fba0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65  ement.**    othe
2fbb0 72 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d  rwise        som
2fbc0 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
2fbd0 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54  occurred.**.** T
2fbe0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2fbf0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2fc00 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74  reeNext().  That
2fc10 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2fc20 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2fc30 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2fc40 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74  merely increment
2fc50 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2fc60 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2fc70 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  Idx.** to the ne
2fc80 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  xt cell on the c
2fc90 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2fca0 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2fcb0 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a  Next() helper.**
2fcc0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2fcd0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2fce0 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2fcf0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2fd00 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73  age or.** to res
2fd10 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2fd20 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
2fd30 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
2fd40 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42  ment in sqlite3B
2fd50 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73  treeNext(C,F) is
2fd60 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20   1, then the.** 
2fd70 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
2fd80 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2fd90 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ex and this rout
2fda0 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2fdb0 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69  een.** skipped i
2fdc0 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20  f the SQL index 
2fdd0 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75  had been a uniqu
2fde0 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20  e index.  The F 
2fdf0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61  argument.** is a
2fe00 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70   hint to the imp
2fe10 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20  lement.  SQLite 
2fe20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2fe30 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73  tion does not us
2fe40 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20  e.** this hint, 
2fe50 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e  but COMDB2 does.
2fe60 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2fe70 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2fe80 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2fe90 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2fea0 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
2feb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2fec0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2fed0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2fee0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
2fef0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ff00 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2ff10 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2ff20 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2ff30 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2ff40 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2ff50 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2ff60 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2ff70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ff80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ff90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2ffa0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2ffb0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2ffc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ffd0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
2ffe0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2fff0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
30000 45 58 54 20 29 7b 0a 20 20 20 20 20 20 70 43 75  EXT ){.      pCu
30010 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
30020 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
30030 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
30040 78 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  xt>0 ) return SQ
30050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
30060 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
30070 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64 78  ur->pPage;.  idx
30080 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20   = ++pCur->ix;. 
30090 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
300a0 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  nit ){.    /* Th
300b0 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79  e only known way
300c0 20 66 6f 72 20 74 68 69 73 20 74 6f 20 68 61 70   for this to hap
300d0 70 65 6e 20 69 73 20 66 6f 72 20 74 68 65 72 65  pen is for there
300e0 20 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20   to be a.    ** 
300f0 72 65 63 75 72 73 69 76 65 20 53 51 4c 20 66 75  recursive SQL fu
30100 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  nction that does
30110 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74   a DELETE operat
30120 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  ion as part of a
30130 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 77  .    ** SELECT w
30140 68 69 63 68 20 64 65 6c 65 74 65 73 20 63 6f 6e  hich deletes con
30150 74 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e  tent out from un
30160 64 65 72 20 61 6e 20 61 63 74 69 76 65 20 63 75  der an active cu
30170 72 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61  rsor.    ** in a
30180 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
30190 65 20 66 69 6c 65 20 77 68 65 72 65 20 74 68 65  e file where the
301a0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 44 45 4c   table being DEL
301b0 45 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20  ETE-ed from.    
301c0 2a 2a 20 68 61 73 20 70 61 67 65 73 20 69 6e 20  ** has pages in 
301d0 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20  common with the 
301e0 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  table being quer
301f0 69 65 64 2e 20 20 53 65 65 20 54 48 33 0a 20 20  ied.  See TH3.  
30200 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31    ** module cov1
30210 2f 62 74 72 65 65 37 38 2e 74 65 73 74 20 74 65  /btree78.test te
30220 73 74 63 61 73 65 20 32 32 30 20 28 32 30 31 38  stcase 220 (2018
30230 2d 30 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20  -06-08) for an. 
30240 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a     ** example. *
30250 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
30260 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30270 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
30280 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30290 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
302a0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
302b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
302c0 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
302d0 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
302e0 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
302f0 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
30300 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
30310 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
30320 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
30330 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
30340 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
30350 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
30360 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
30370 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
30380 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
30390 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
303a0 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
303b0 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
303c0 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
303d0 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
303e0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
303f0 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
30400 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
30410 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
30420 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
30430 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
30440 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
30450 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
30460 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
30470 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
30480 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
30490 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
304a0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
304b0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
304c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
304d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
304e0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
304f0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
30500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30510 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
30520 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
30530 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
30540 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
30550 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
30560 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d  pCur->ix>=pPage-
30570 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
30580 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
30590 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
305a0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
305b0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
305c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
305d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
305e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
305f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
30600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30610 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
30620 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
30630 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
30640 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
30650 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
30660 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67   *pCur, int flag
30670 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
30680 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Page;.  UNUSED_P
30690 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20  ARAMETER( flags 
306a0 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43  );  /* Used in C
306b0 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61  OMDB2 but not na
306c0 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20  tive SQLite */. 
306d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
306e0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
306f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
30700 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
30710 3d 3d 31 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ==1 );.  pCur->i
30720 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
30730 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
30740 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
30750 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
30760 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  fl);.  if( pCur-
30770 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
30780 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62  VALID ) return b
30790 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a  treeNext(pCur);.
307a0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
307b0 70 50 61 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b  pPage;.  if( (++
307c0 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65  pCur->ix)>=pPage
307d0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
307e0 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72  Cur->ix--;.    r
307f0 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
30800 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pCur);.  }.  if(
30810 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
30820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30830 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
30840 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
30850 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
30860 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
30870 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
30880 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
30890 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
308a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
308b0 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73  ** Return values
308c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
308d0 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73  TE_OK     succes
308e0 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
308f0 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f  DONE   the curso
30900 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20  r is already on 
30910 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
30920 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  t of the table.*
30930 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  *     otherwise 
30940 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
30950 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
30960 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
30970 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
30980 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
30990 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
309a0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
309b0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
309c0 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
309d0 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
309e0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
309f0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
30a00 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
30a10 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
30a20 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
30a30 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
30a40 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
30a50 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
30a60 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
30a70 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
30a80 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
30a90 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
30aa0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
30ab0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
30ac0 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
30ad0 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
30ae0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
30af0 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a  C,F) is 1, then.
30b00 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  ** the cursor co
30b10 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
30b20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
30b30 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
30b40 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
30b50 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
30b60 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
30b70 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
30b80 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   The F argument 
30b90 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20  is a.** hint to 
30ba0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
30bb0 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74  The native SQLit
30bc0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
30bd0 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a  tation does not.
30be0 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ** use this hint
30bf0 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
30c00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
30c10 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
30c20 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
30c30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
30c40 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
30c50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
30c60 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
30c70 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
30c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
30c90 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
30ca0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
30cb0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
30cc0 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
30cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
30ce0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
30cf0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
30d00 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
30d10 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
30d20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
30d30 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
30d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
30d60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30d70 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
30d80 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
30d90 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
30da0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
30db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
30dc0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43  SOR_SKIPNEXT==pC
30dd0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
30de0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
30df0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
30e00 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
30e10 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 20 72 65  >skipNext<0 ) re
30e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30e30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
30e40 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30e50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
30e60 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
30e70 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
30e80 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
30e90 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72   pCur->ix;.    r
30ea0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
30eb0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
30ec0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
30ed0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
30ee0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30ef0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
30f00 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
30f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
30f20 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29  e( pCur->ix==0 )
30f30 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
30f40 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
30f50 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
30f60 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
30f70 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
30f80 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
30f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
30fa0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
30fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
30fc0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
30fd0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
30fe0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
30ff0 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
31000 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
31010 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ;..    pCur->ix-
31020 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
31030 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
31040 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
31050 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
31060 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
31070 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
31080 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20  ious(pCur, 0);. 
31090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
310a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
310b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
310c0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
310d0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
310e0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
310f0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
31100 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
31110 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
31120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
31130 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
31140 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
31150 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20  ARAMETER( flags 
31160 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43  );  /* Used in C
31170 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61  OMDB2 but not na
31180 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20  tive SQLite */. 
31190 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
311a0 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
311b0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
311c0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b  BTCF_ValidNKey);
311d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
311e0 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
311f0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
31200 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20  SOR_VALID.   || 
31210 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c  pCur->ix==0.   |
31220 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  | pCur->pPage->l
31230 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  eaf==0.  ){.    
31240 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76  return btreePrev
31250 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a  ious(pCur);.  }.
31260 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
31270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
31290 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
312a0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
312b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
312c0 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
312d0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
312e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
312f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31300 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
31310 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
31320 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
31330 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
31340 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
31350 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
31360 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
31370 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
31380 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
31390 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
313a0 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
313b0 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
313c0 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
313d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
313e0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
313f0 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
31400 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
31410 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
31420 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
31430 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e  NULL in the even
31440 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
31450 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
31460 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
31470 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e  s not 0, then an
31480 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
31490 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
314a0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
314b0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
314c0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
314d0 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
314e0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
314f0 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
31500 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
31510 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
31520 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
31530 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
31540 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
31550 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
31560 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20  ** If the eMode 
31570 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41  parameter is BTA
31580 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74  LLOC_EXACT and t
31590 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65  he nearby page e
315a0 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72  xists.** anywher
315b0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
315c0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
315d0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
315e0 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a  returned.  If.**
315f0 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
31600 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61  C_LT then the pa
31610 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
31620 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
31630 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61   equal.** to nea
31640 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20  rby if any such 
31650 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66  page exists.  If
31660 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
31670 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65  C_ANY then there
31680 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72  .** are no restr
31690 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68  ictions on which
316a0 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65   page is returne
316b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
316c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
316d0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
316e0 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
316f0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
31700 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
31710 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
31720 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
31730 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
31740 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
31750 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
31760 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
31770 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
31780 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
31790 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
317a0 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
317b0 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
317c0 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
317d0 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
317e0 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
317f0 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
31800 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ANY */.){.  MemP
31810 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
31820 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
31830 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31840 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
31850 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
31860 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
31870 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
31880 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
31890 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
318a0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
318b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
318c0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
318d0 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
318e0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
318f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31900 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
31910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
31920 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
31930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  );.  assert( eMo
31940 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20  de==BTALLOC_ANY 
31950 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20  || (nearby>0 && 
31960 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
31970 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b  >autoVacuum)) );
31980 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
31990 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
319a0 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
319b0 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56  nt(pBt);.  /* EV
319c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31  IDENCE-OF: R-051
319d0 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62  19-02637 The 4-b
319e0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
319f0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
31a00 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20   36.  ** stores 
31a10 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c  stores the total
31a20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31a30 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
31a40 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62  . */.  n = get4b
31a50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
31a60 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
31a70 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
31a80 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
31a90 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
31aa0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31ab0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
31ac0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
31ad0 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
31ae0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
31af0 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
31b00 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
31b10 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
31b20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
31b30 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
31b40 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
31b50 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
31b60 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75  nearby' */.    u
31b70 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20  32 nSearch = 0; 
31b80 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68    /* Count of th
31b90 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72  e number of sear
31ba0 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20  ch attempts */. 
31bb0 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d     .    /* If eM
31bc0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
31bd0 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  CT and a query o
31be0 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
31bf0 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
31c00 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
31c10 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
31c20 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
31c30 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
31c40 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
31c50 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
31c60 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
31c70 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
31c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31c90 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
31ca0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
31cb0 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ACT ){.      if(
31cc0 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
31cd0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
31ce0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ype;.        ass
31cf0 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
31d00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31d10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31d20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
31d30 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
31d40 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
31d50 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
31d60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31d70 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
31d80 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
31d90 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GE ){.          
31da0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
31db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31dc0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
31dd0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
31de0 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63  E ){.      searc
31df0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d  hList = 1;.    }
31e00 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
31e10 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
31e20 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
31e30 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
31e40 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
31e50 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
31e60 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
31e70 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
31e80 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
31e90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
31ea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31eb0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
31ec0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
31ed0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
31ee0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
31ef0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
31f00 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
31f10 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
31f20 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
31f30 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
31f40 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
31f50 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
31f60 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
31f70 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
31f80 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
31f90 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
31fa0 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
31fb0 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
31fc0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
31fd0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
31fe0 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20  XACT).    ** or 
31ff0 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73  until a page les
32000 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20  s than 'nearby' 
32010 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
32020 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20  e==BTALLOC_LT). 
32030 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
32040 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
32050 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
32060 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
32070 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
32080 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30  DENCE-OF: R-0150
32090 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73  6-11053 The firs
320a0 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  t integer on a f
320b0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
320c0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ge.        ** is
320d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
320e0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
320f0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
32100 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a   in the list or.
32110 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20          ** zero 
32120 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  if this is the l
32130 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ast freelist tru
32140 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nk page. */.    
32150 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
32160 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
32170 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
32180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32190 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
321a0 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38  F: R-59841-13798
321b0 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
321c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
321d0 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20  t offset 32.    
321e0 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68      ** stores th
321f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
32200 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
32210 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  of the freelist,
32220 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20   or zero if.    
32230 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c      ** the freel
32240 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ist is empty. */
32250 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
32260 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
32270 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
32280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
32290 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
322a0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
322b0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
322c0 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e  e || nSearch++ >
322d0 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   n ){.        rc
322e0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
322f0 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75 6e  T_PGNO(pPrevTrun
32300 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d 3e  k ? pPrevTrunk->
32310 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20 20  pgno : 1);.     
32320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32330 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32340 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
32350 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
32360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32370 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
32380 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
32390 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
323a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
323b0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
323c0 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
323d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
323e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
323f0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
32400 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
32410 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
32420 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
32430 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
32440 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
32450 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
32460 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
32470 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
32480 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
32490 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
324a0 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
324b0 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
324c0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
324d0 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
324e0 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
324f0 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
32500 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
32510 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
32520 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
32530 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
32540 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
32550 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
32560 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
32570 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32580 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
32590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
325a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
325b0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
325c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
325d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
325e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
325f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
32600 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
32610 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
32620 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
32630 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
32640 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
32650 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
32660 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
32670 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
32680 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
32690 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
326a0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
326b0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
326c0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
326d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
326e0 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
326f0 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
32700 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
32710 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
32720 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
32730 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
32740 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32750 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54  _CORRUPT_PGNO(iT
32760 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 67  runk);.        g
32770 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
32780 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
32790 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
327a0 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
327b0 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
327c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
327d0 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b   (nearby==iTrunk
327e0 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72   || (iTrunk<near
327f0 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
32800 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
32810 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32820 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
32830 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
32840 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
32850 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
32860 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
32870 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
32880 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
32890 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
328a0 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  /.        *pPgno
328b0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
328c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
328d0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
328e0 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
328f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32900 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32910 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32920 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32930 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32940 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32960 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
32970 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
32980 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
32990 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
329a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
329b0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
329c0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
329d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
329e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
329f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32a00 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
32a10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
32a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32a40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32a50 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32a70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
32a80 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
32a90 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
32aa0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
32ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32ad0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
32ae0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
32af0 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
32b00 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
32b10 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
32b20 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
32b30 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
32b40 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
32b50 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
32b60 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
32b70 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
32b80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
32b90 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
32ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
32bb0 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
32bc0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32bd0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
32be0 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
32bf0 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
32c00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32c10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
32c20 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
32c30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32c40 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
32c50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32c60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
32c70 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
32c80 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
32c90 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
32ca0 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
32cb0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
32cc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
32cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32ce0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32cf0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32d00 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
32d20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32d30 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
32d40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32d50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32d70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32d80 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
32d90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32da0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32db0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32dc0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32dd0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32de0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
32df0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
32e00 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
32e10 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32e20 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
32e30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
32e40 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
32e50 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
32e60 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
32e70 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
32e80 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
32e90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32ea0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
32eb0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
32ec0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
32ed0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
32ee0 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
32ef0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
32f00 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
32f10 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
32f20 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
32f30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
32f40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32f50 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
32f60 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32f70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32f90 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32fa0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32fc0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
32fd0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
32fe0 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
32ff0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
33010 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
33020 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
33030 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
33040 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
33050 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
33060 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
33070 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
33080 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
33090 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
330a0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
330b0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
330c0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
330d0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
330e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
330f0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
33100 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
33110 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
33120 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
33130 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
33140 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
33150 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
33160 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
33170 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
33180 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
33190 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
331a0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
331b0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
331c0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
331d0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
331e0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
331f0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
33200 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
33210 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
33220 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
33230 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33240 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
33250 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
33260 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
33270 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
33280 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
33290 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
332a0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
332b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
332c0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
332d0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
332e0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
332f0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
33300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
33310 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
33320 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
33330 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
33340 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
33350 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
33360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
33370 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
33380 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33390 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
333a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
333b0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
333c0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
333d0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
333e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
333f0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
33400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
33410 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
33420 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
33430 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
33440 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
33450 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
33460 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
33470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
33480 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
33490 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
334a0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
334b0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
334c0 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20  Page==nearby || 
334d0 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26  (iPage<nearby &&
334e0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
334f0 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b  LE)) .        ){
33500 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
33510 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
33520 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
33530 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
33540 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
33550 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
33560 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
33570 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
33580 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
33590 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
335a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
335b0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
335c0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
335d0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
335e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
335f0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
33600 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33610 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
33620 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
33630 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
33640 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
33650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33660 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
33670 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
33680 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
33690 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
336a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
336b0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
336c0 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
336d0 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
336e0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
336f0 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54  Pgno)? PAGER_GET
33700 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a  _NOCONTENT : 0;.
33710 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
33720 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
33730 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
33740 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
33750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
33760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
33780 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33790 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
337a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
337b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
337c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
337d0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
337e0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
337f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70               *pp
33800 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
33810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33820 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
33830 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
33840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33850 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
33860 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
33870 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
33880 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
33890 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
338a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
338b0 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
338c0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
338d0 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e  t, so append a n
338e0 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20  ew page to the. 
338f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
33900 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mage..    **.   
33910 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65   ** Normally, ne
33920 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65  w pages allocate
33930 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20  d by this block 
33940 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64  can be requested
33950 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
33960 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
33970 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
33980 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69  t' flag set. Thi
33990 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  s prevents the p
339a0 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  ager.    ** from
339b0 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   trying to read 
339c0 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e  the pages conten
339d0 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77  t from disk. How
339e0 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20  ever, if the.   
339f0 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e   ** current tran
33a00 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
33a10 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d  ady run one or m
33a20 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d  ore incremental-
33a30 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74  vacuum.    ** st
33a40 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61  eps, then the pa
33a50 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ge we are about 
33a60 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20  to allocate may 
33a70 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a  contain content.
33a80 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72      ** that is r
33a90 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65  equired in the e
33aa0 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
33ab0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
33ac0 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
33ad0 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  set the no-conte
33ae0 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61  nt flag. This ca
33af0 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74  uses the pager t
33b00 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e  o load and journ
33b10 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  al.    ** the cu
33b20 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
33b30 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  nt before overwr
33b40 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
33b50 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
33b60 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  t the pager will
33b70 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74   not actually at
33b80 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72  tempt to load or
33b90 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
33ba0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
33bb0 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c   page that reall
33bc0 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20  y does lie past 
33bd0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
33be0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
33bf0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ile on disk. So 
33c00 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64  the effects of d
33c10 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d  isabling the no-
33c20 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61  content optimiza
33c30 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65  tion.    ** here
33c40 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f   are confined to
33c50 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61   those pages tha
33c60 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68  t lie between th
33c70 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
33c80 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
33c90 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f  ge and the end o
33ca0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
33cb0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
33cc0 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d  int bNoContent =
33cd0 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56   (0==IfNotOmitAV
33ce0 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
33cf0 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  e))? PAGER_GET_N
33d00 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20  OCONTENT:0;..   
33d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33d20 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
33d30 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
33d40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33d50 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
33d60 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
33d70 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
33d80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33d90 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
33da0 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
33db0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33dc0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
33dd0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
33de0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
33df0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
33e00 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
33e10 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
33e20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
33e30 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
33e40 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
33e50 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
33e60 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
33e70 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
33e80 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
33e90 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
33ea0 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
33eb0 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
33ec0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
33ed0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
33ee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
33ef0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
33f00 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
33f10 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
33f20 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
33f30 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
33f40 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
33f50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
33f60 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
33f70 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
33f80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
33f90 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
33fa0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
33fb0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
33fc0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
33fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
33fe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
33ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34000 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
34010 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34020 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
34030 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
34040 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34050 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
34060 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
34070 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
34080 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
34090 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
340a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
340b0 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
340c0 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
340d0 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
340e0 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
340f0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
34100 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
34110 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
34120 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
34130 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
34140 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
34150 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43  no, ppPage, bNoC
34160 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  ontent);.    if(
34170 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34180 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34190 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
341a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
341b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
341c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
341d0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
341e0 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
341f0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  age = 0;.    }. 
34200 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
34210 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
34220 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
34230 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
34240 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
34250 20 7c 7c 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44   || *pPgno!=PEND
34260 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
34270 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
34280 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
34290 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
342a0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
342b0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73  PrevTrunk);.  as
342c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
342d0 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
342e0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
342f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
34300 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65  ge)<=1 );.  asse
34310 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
34320 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  K || (*ppPage)->
34330 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
34340 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34350 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34360 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
34370 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
34380 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34390 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
343a0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
343b0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
343c0 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
343d0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
343e0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
343f0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
34400 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
34410 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
34420 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
34430 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
34440 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
34450 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
34460 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
34470 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
34480 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
34490 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
344a0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
344b0 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
344c0 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
344d0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
344e0 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
344f0 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
34500 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
34510 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
34520 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
34530 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
34540 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
34550 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
34560 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
34570 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
34580 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
34590 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
345a0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
345b0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
345c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
345d0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
345e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
345f0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
34600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
34610 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
34620 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34630 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
34640 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
34650 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
34660 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
34670 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
34680 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
34690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346a0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
346b0 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
346c0 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
346d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
346f0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
34700 20 75 33 32 20 6e 46 72 65 65 3b 20 20 20 20 20   u32 nFree;     
34710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34720 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
34730 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34740 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
34750 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34760 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
34770 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
34780 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
34790 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a  B || iPage>1 );.
347a0 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
347b0 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
347c0 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
347d0 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 7c  .  if( iPage<2 |
347e0 7c 20 69 50 61 67 65 3e 70 42 74 2d 3e 6e 50 61  | iPage>pBt->nPa
347f0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
34800 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34810 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
34820 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
34830 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
34840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
34850 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
34860 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
34870 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
34880 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
34890 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
348a0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
348b0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
348c0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
348d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
348e0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
348f0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
34900 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
34910 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
34920 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
34930 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
34940 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34950 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
34960 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
34970 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
34980 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
34990 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
349a0 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
349b0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
349c0 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
349d0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
349e0 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
349f0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
34a00 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
34a10 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
34a20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
34a30 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
34a40 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
34a50 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
34a60 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
34a70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34a80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
34a90 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
34aa0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34ab0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
34ac0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
34ad0 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
34ae0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
34af0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
34b00 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
34b10 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
34b20 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
34b30 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
34b40 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
34b50 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
34b60 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
34b70 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
34b80 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
34b90 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
34ba0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
34bb0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
34bc0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
34bd0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
34be0 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
34bf0 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
34c00 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
34c10 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
34c20 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
34c30 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
34c40 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
34c50 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
34c60 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
34c70 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
34c80 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
34c90 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
34ca0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
34cb0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
34cc0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
34cd0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
34ce0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
34cf0 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
34d00 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
34d10 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
34d20 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
34d30 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
34d40 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
34d50 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
34d60 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
34d70 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
34d80 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
34d90 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
34da0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
34db0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
34dc0 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
34dd0 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
34de0 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
34df0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
34e00 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
34e10 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
34e20 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
34e30 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
34e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
34e60 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34e70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
34e80 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
34e90 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
34ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
34eb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
34ec0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
34ed0 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
34ee0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
34ef0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34f00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34f10 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34f20 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34f30 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
34f40 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
34f50 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
34f60 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
34f70 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
34f80 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
34f90 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
34fa0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
34fb0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
34fc0 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
34fd0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
34fe0 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
34ff0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
35000 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
35010 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
35020 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
35030 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
35040 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
35050 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
35060 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
35070 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
35080 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
35090 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
350a0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
350b0 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
350c0 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
350d0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
350e0 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
350f0 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
35100 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
35110 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
35120 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
35130 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
35140 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
35150 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
35160 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
35170 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
35180 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
35190 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
351a0 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
351b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
351c0 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
351d0 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
351e0 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
351f0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
35200 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
35210 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
35220 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
35230 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
35240 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
35250 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
35260 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
35270 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
35280 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
35290 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
352a0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
352b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
352c0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
352d0 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f  R-19920-11576 Ho
352e0 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72  wever, newer ver
352f0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
35300 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61  still.      ** a
35310 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c  void using the l
35320 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20  ast six entries 
35330 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  in the freelist 
35340 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79  trunk page array
35350 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
35360 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65  er that database
35370 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62   files created b
35380 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
35390 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62   of SQLite can b
353a0 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  e.      ** read 
353b0 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
353c0 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20  s of SQLite..   
353d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
353e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
353f0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
35400 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
35410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35420 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
35430 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
35440 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
35450 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
35460 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
35470 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
35480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
35490 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
354a0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
354b0 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
354c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
354d0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
354e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
354f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35500 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
35510 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
35520 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
35530 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
35540 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
35550 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
35560 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
35570 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
35580 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
35590 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
355a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
355b0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
355c0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
355d0 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
355e0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
355f0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
35600 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
35610 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
35620 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
35630 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
35640 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
35650 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
35660 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
35670 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
35680 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
35690 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
356a0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
356b0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
356c0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
356d0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
356e0 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
356f0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
35700 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
35710 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
35720 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
35730 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
35740 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
35750 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
35760 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
35770 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
35780 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35790 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
357a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
357b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
357c0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
357d0 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
357e0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
357f0 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
35800 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
35810 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
35820 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
35830 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
35840 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
35850 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
35860 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
35870 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
35880 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
35890 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
358a0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
358b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
358c0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
358d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
358e0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
358f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
35900 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
35910 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
35920 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
35930 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
35940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35950 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
35960 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
35970 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
35980 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
35990 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
359a0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
359b0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
359c0 20 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a 2a   Cell.  Store.**
359d0 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   size informatio
359e0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
359f0 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73 74   in pInfo..*/.st
35a00 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
35a10 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
35a20 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
35a30 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
35a40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
35a50 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
35a60 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
35a70 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
35a80 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43   the Cell */.  C
35a90 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
35aa0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
35ab0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
35ac0 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  t the cell */.){
35ad0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35ae0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
35af0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
35b00 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
35b10 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
35b20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35b30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
35b40 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
35b50 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
35b60 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
35b70 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66  ll, pInfo);.  if
35b80 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d  ( pInfo->nLocal=
35b90 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  =pInfo->nPayload
35ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
35bb0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
35bc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
35bd0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
35be0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
35bf0 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  /.  }.  testcase
35c00 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d  ( pCell + pInfo-
35c10 3e 6e 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 2d  >nSize == pPage-
35c20 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 74  >aDataEnd );.  t
35c30 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b  estcase( pCell +
35c40 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31   (pInfo->nSize-1
35c50 29 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ) == pPage->aDat
35c60 61 45 6e 64 20 29 3b 0a 20 20 69 66 28 20 70 43  aEnd );.  if( pC
35c70 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69  ell + pInfo->nSi
35c80 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  ze > pPage->aDat
35c90 61 45 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 43  aEnd ){.    /* C
35ca0 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
35cb0 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
35cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35cd0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
35ce0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 6f 76 66  Page);.  }.  ovf
35cf0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
35d00 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e  (pCell + pInfo->
35d10 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70 42  nSize - 4);.  pB
35d20 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
35d30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
35d40 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
35d50 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
35d60 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
35d70 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
35d80 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
35d90 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  d - pInfo->nLoca
35da0 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
35db0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
35dc0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
35dd0 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
35de0 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49  ORRUPT_DB && (pI
35df0 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20  nfo->nPayload + 
35e00 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
35e10 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
35e20 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
35e30 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
35e40 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
35e50 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
35e60 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
35e70 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
35e80 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
35e90 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
35ea0 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
35eb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
35ec0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
35ed0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
35ee0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
35ef0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
35f00 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
35f10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
35f20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
35f30 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
35f40 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
35f50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35f60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35f70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
35f80 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
35f90 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
35fa0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
35fb0 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
35fc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
35fd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
35fe0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
35ff0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
36000 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
36010 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
36020 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
36030 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
36040 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
36050 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
36060 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
36070 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
36080 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
36090 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
360a0 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
360b0 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
360c0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
360d0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
360e0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
360f0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
36100 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
36110 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
36120 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
36130 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
36140 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
36150 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
36160 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
36170 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
36180 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
36190 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
361a0 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
361b0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
361c0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
361d0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
361e0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
361f0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
36200 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
36210 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
36220 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
36230 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
36240 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
36250 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
36260 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
36270 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
36280 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
36290 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
362a0 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
362b0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
362c0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
362d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
362e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
362f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
36300 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
36310 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
36320 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
36330 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
36340 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
36350 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36360 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
36370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
36380 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36390 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
363a0 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
363b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
363c0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
363d0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
363e0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
363f0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
36400 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
36410 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
36420 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
36430 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
36440 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
36450 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
36460 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
36470 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
36480 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
36490 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
364a0 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
364b0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
364c0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
364d0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
364e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
364f0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
36500 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
36510 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
36520 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
36530 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
36540 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
36550 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
36560 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
36570 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
36580 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
36590 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
365a0 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
365b0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
365c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
365d0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
365e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
365f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36600 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
36610 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
36620 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
36630 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
36640 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
36650 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
36660 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65   */.  const Btre
36670 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20  ePayload *pX,   
36680 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20       /* Payload 
36690 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f  with which to co
366a0 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c  nstruct the cell
366b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
366c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
366d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
366e0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
366f0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
36700 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
36710 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
36720 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e   n, rc, mn;.  in
36730 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
36740 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
36750 73 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  se;.  unsigned c
36760 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
36770 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
36780 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
36790 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ed *pBt;.  Pgno 
367a0 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  pgnoOvfl;.  int 
367b0 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65  nHeader;..  asse
367c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
367d0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
367e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
367f0 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
36800 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
36810 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
36820 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
36830 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
36840 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
36850 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
36860 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
36870 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
36880 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
36890 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
368a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
368b0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  ->pBt->pageSize]
368c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
368d0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
368e0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
368f0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
36900 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
36910 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
36920 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
36930 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  PtrSize;.  if( p
36940 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
36950 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70      nPayload = p
36960 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e  X->nData + pX->n
36970 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d  Zero;.    pSrc =
36980 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20   pX->pData;.    
36990 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61  nSrc = pX->nData
369a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
369b0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
369c0 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c  ); /* fillInCell
369d0 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  () only called f
369e0 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20  or leaves */.   
369f0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
36a00 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
36a10 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
36a20 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  d);.    nHeader 
36a30 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
36a40 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
36a50 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b  u64*)&pX->nKey);
36a60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
36a70 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d  sert( pX->nKey<=
36a80 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58  0x7fffffff && pX
36a90 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  ->pKey!=0 );.   
36aa0 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64   nSrc = nPayload
36ab0 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79   = (int)pX->nKey
36ac0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
36ad0 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64  >pKey;.    nHead
36ae0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
36af0 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
36b00 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
36b10 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  }.  .  /* Fill i
36b20 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
36b30 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
36b40 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
36b50 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
36b60 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
36b70 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
36b80 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
36b90 20 77 68 65 72 65 20 65 76 65 72 79 74 68 69 6e   where everythin
36ba0 67 20 66 69 74 73 20 6f 6e 20 74 68 65 20 62 74  g fits on the bt
36bb0 72 65 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  ree page.    ** 
36bc0 61 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  and no overflow 
36bd0 70 61 67 65 73 20 61 72 65 20 72 65 71 75 69 72  pages are requir
36be0 65 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e  ed. */.    n = n
36bf0 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61  Header + nPayloa
36c00 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  d;.    testcase(
36c10 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73   n==3 );.    tes
36c20 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20  tcase( n==4 );. 
36c30 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d     if( n<4 ) n =
36c40 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   4;.    *pnSize 
36c50 3d 20 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = n;.    assert(
36c60 20 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64 20   nSrc<=nPayload 
36c70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
36c80 20 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20 29   nSrc<nPayload )
36c90 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
36ca0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53 72  yload, pSrc, nSr
36cb0 63 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  c);.    memset(p
36cc0 50 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30 2c  Payload+nSrc, 0,
36cd0 20 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29 3b   nPayload-nSrc);
36ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
36cf0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
36d00 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
36d10 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
36d20 73 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74  s that some of t
36d30 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  he content will 
36d40 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70 69  need.  ** to spi
36d50 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll onto overflow
36d60 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d   pages..  */.  m
36d70 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
36d80 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20  cal;.  n = mn + 
36d90 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
36da0 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
36db0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
36dc0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
36dd0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
36de0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
36df0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
36e00 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e 20  +1 );.  if( n > 
36e10 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
36e20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61 63  ) n = mn;.  spac
36e30 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e  eLeft = n;.  *pn
36e40 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
36e50 65 72 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f 72  er + 4;.  pPrior
36e60 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
36e70 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65 61  r+n];.  pToRelea
36e80 73 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f 76  se = 0;.  pgnoOv
36e90 66 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d 20  fl = 0;.  pBt = 
36ea0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f  pPage->pBt;..  /
36eb0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
36ec0 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64  variables should
36ed0 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   be set as follo
36ee0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
36ef0 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  nPayload        
36f00 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64     Total payload
36f10 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20   size in bytes. 
36f20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20   **   pPayload  
36f30 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77           Begin w
36f40 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68  riting payload h
36f50 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65  ere.  **   space
36f60 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70  Left          Sp
36f70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74  ace available at
36f80 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e   pPayload.  If n
36f90 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66  Payload>spaceLef
36fa0 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  t,.  **         
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
36fc0 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20  t means content 
36fd0 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20  must spill into 
36fe0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
36ff0 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20    **   *pnSize  
37000 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f            Size o
37010 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c  f the local cell
37020 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f   (not counting o
37030 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20  verflow pages). 
37040 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20   **   pPrior    
37050 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74           Where t
37060 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f  o write the pgno
37070 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
37080 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a  erflow page.  **
37090 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c  .  ** Use a call
370a0 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
370b0 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66  llPtr() to verif
370c0 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  y that the value
370d0 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72  s above.  ** wer
370e0 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65  e computed corre
370f0 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ctly..  */.#ifde
37100 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
37110 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
37120 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  info;.    pPage-
37130 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
37140 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
37150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
37160 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66  eader==(int)(inf
37170 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65  o.pPayload - pCe
37180 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ll) );.    asser
37190 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58  t( info.nKey==pX
371a0 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73  ->nKey );.    as
371b0 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d  sert( *pnSize ==
371c0 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20   info.nSize );. 
371d0 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65     assert( space
371e0 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f  Left == info.nLo
371f0 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  cal );.  }.#endi
37200 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  f..  /* Write th
37210 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74  e payload into t
37220 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e  he local Cell an
37230 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f  d any extra into
37240 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
37250 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
37260 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
37270 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
37280 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
37290 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
372a0 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
372b0 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
372c0 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
372d0 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
372e0 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
372f0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
37300 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
37310 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37320 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
37330 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
37340 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
37350 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
37360 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
37370 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
37380 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
37390 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
373a0 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
373b0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
373c0 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
373d0 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
373e0 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
373f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
37400 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
37410 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
37420 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
37430 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
37440 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
37450 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
37460 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 3d  ..    if( nSrc>=
37470 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  n ){.      memcp
37480 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
37490 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , n);.    }else 
374a0 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
374b0 20 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20      n = nSrc;.  
374c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
374d0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
374e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
374f0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
37500 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
37510 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
37520 0a 20 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  .    if( nPayloa
37530 64 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d<=0 ) break;.  
37540 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
37550 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
37560 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
37570 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
37580 6e 3b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  n;.    if( space
37590 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
375a0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
375b0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
375c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
375d0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
375e0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
375f0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
37600 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
37610 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
37620 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
37630 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
37640 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
37650 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
37660 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
37670 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
37680 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
37690 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
376a0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
376b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
376c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
376d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
376e0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
376f0 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
37700 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
37710 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
37720 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
37730 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
37740 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
37750 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
37760 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
37770 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
37780 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
37790 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
377a0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
377b0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
377c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
377d0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
377e0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
377f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
37800 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
37810 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
37820 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
37830 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
37840 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
37850 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
37860 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
37870 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
37880 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
37890 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
378a0 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
378b0 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
378c0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
378d0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
378e0 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
378f0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
37900 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
37910 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
37920 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
37930 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
37940 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
37950 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
37960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37970 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
37980 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
37990 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
379a0 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
379b0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
379c0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
379d0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
379e0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
379f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
37a00 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
37a10 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
37a20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37a30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
37a40 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
37a50 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
37a60 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
37a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37a80 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
37a90 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
37aa0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
37ab0 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
37ac0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
37ad0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
37ae0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
37af0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
37b00 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
37b10 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
37b20 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
37b30 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
37b40 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
37b50 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
37b60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
37b70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
37b80 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
37b90 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
37ba0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
37bb0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
37bc0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
37bd0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
37be0 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
37bf0 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
37c00 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
37c10 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
37c20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
37c30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
37c40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
37c50 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
37c60 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
37c70 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
37c80 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
37c90 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
37ca0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
37cb0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
37cc0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
37cd0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
37ce0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
37cf0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
37d00 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
37d10 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
37d20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
37d30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
37d40 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
37d50 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
37d60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
37d70 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
37d80 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
37d90 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
37da0 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
37db0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
37dc0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
37dd0 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
37de0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
37df0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
37e00 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
37e10 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
37e20 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
37e30 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
37e40 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
37e50 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
37e60 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
37e70 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
37e80 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
37e90 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
37ea0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
37eb0 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
37ec0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
37ed0 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
37ee0 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
37ef0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
37f00 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
37f10 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
37f20 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
37f30 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
37f40 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
37f50 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
37f60 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
37f70 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
37f80 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
37f90 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
37fa0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
37fb0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
37fc0 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
37fd0 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
37fe0 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
37ff0 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
38000 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
38010 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
38020 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
38030 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
38040 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  l );.  assert( C
38050 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d  ORRUPT_DB || sz=
38060 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
38070 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
38080 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
38090 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
380a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
380b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
380c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
380d0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
380e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
380f0 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ->nFree>=0 );.  
38100 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
38110 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50  ata;.  ptr = &pP
38120 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  age->aCellIdx[2*
38130 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
38140 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64  2byte(ptr);.  hd
38150 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
38160 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65  fset;.  testcase
38170 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26  ( pc==get2byte(&
38180 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
38190 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
381a0 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z==pPage->pBt->u
381b0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
381c0 66 28 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  f( pc+sz > pPage
381d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
381e0 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
381f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
38200 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
38210 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
38220 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
38230 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
38240 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
38250 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
38260 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
38270 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
38280 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
38290 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
382a0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
382b0 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
382c0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
382d0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
382e0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
382f0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
38300 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
38310 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
38320 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
38330 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
38340 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
38350 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
38360 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
38370 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
38380 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
38390 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
383a0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
383b0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
383c0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
383d0 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
383e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
383f0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
38400 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
38410 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
38420 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
38430 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
38440 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
38450 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
38460 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
38470 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
38480 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
38490 0a 2a 2a 20