/ Hex Artifact Content
Login

Artifact a644e8f3b71205e1e360ed5a28d8fc8feaa5c63fee3a49a36711ff83f4bdf6d2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
7170: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
7180: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
7190: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
71a0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
71b0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
71c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
71d0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
71e0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
71f0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
7200: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
7210: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
7220: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
7230: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
7240: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
7250: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
7260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7270: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7280: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
7290: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
72a0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
72b0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
72c0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
72d0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
72e0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
72f0: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
7300: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
7310: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
7320: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
7330: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
7340: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
7360: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
7370: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
7380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7390: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
73a0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
73b0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
73c0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
73d0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
73e0: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
73f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7400: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
7410: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
7420: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
7430: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
7440: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
7450: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
7460: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
7470: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
7480: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
7490: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
74a0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
74b0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
74c0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
74d0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
74e0: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
74f0: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
7500: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
7510: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
7520: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
7530: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
7540: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
7550: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7560: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
7570: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
7580: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
7590: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
75c0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
75d0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
75e0: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
75f0: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
7600: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7610: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
7620: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7630: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
7640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7650: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7660: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
7670: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
7680: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
7690: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
76a0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
76b0: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
76c0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
76d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
76e0: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
76f0: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
7700: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
7710: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
7720: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7730: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7740: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
7750: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
7760: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
7770: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7780: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
7790: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
77a0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
77b0: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
77c0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
77d0: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
77e0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
77f0: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7800: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7810: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7820: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7830: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7840: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
7850: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
7860: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
7870: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
7880: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
7890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
78a0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
78b0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
78c0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
78d0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
78e0: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
78f0: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7900: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7910: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7920: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7930: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7940: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
7950: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
7960: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
7970: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
7980: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
7990: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
79a0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
79b0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
79c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
79d0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
79e0: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
79f0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7a00: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7a10: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7a20: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7a30: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7a40: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
7a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7a60: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7a70: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
7a80: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
7a90: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
7aa0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7ab0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7ac0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7ad0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7ae0: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7af0: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7b00: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7b10: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7b20: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7b30: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7b40: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7b50: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
7b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7b70: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
7b80: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7b90: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
7ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7bb0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7bc0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7bd0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7be0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7bf0: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
7c00: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7c20: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7c30: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7c40: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7c50: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c60: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c70: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c80: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c90: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7ca0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7cb0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7cc0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7cd0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7ce0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7cf0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7d00: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7d10: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7d20: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7d30: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7d40: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7d50: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d60: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d70: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d80: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d90: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7da0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7db0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7dc0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7dd0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7e00: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7e10: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7e20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7e30: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7e40: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7e50: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e60: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e70: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e90: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7ea0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7eb0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7ec0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ed0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7ee0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7ef0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7f00: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7f10: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7f20: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7f30: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7f40: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7f50: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f60: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f70: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f80: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f90: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7fa0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7fb0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7fc0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7fd0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7fe0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7ff0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8000: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8010: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8020: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8030: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8060: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8070: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8080: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8090: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
80a0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
80b0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
80c0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
80d0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
80e0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
80f0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8100: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8110: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8120: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8140: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8150: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8160: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8180: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
81a0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
81b0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
81c0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
81d0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
81e0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81f0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8200: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8210: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8220: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8230: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8240: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8250: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8260: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8270: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8280: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8290: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
82a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
82b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82c0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
82d0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
82e0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
82f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8300: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8310: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8320: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8330: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8340: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8350: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8360: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8370: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8380: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8390: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
83a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
83b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
83d0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
83e0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
83f0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8400: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
84a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
84b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
84c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
84d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
84e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
84f0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
8500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
8510: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
8520: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8530: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8540: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8550: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8560: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8570: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8590: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
85a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
85b0: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
85c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
85d0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
85e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
85f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
8600: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
8610: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
8620: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8630: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8640: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8650: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8660: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8670: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8680: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8690: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
86a0: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
86b0: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
86c0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
86d0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
86e0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
86f0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
8700: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
8710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8720: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8730: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8740: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8750: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8760: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8770: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8780: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8790: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
87a0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
87b0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
87c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
87d0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
87e0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
87f0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8800: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8810: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8820: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8830: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8840: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8860: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8870: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8880: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8890: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
88a0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
88b0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
88c0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
88d0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
88e0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
88f0: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8900: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8920: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8950: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8960: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8970: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8980: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8990: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
89a0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
89b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
89c0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
89d0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
89e0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
89f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8a00: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8a10: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8a20: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8a30: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8a40: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8a50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a80: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a90: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8aa0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8ab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8ac0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8ad0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8af0: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8b00: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8b30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8b40: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8b50: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b70: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b80: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b90: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8bc0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8bd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8be0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8bf0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8c00: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8c10: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8c20: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8c30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8c40: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c80: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c90: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8ca0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8cb0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8cc0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8cd0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8ce0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8cf0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8d00: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8d10: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8d20: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8d30: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8d40: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8d50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d60: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d80: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d90: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8da0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8dc0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8dd0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8de0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8df0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8e00: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8e10: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8e30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8e40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8e50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8ea0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8eb0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8ec0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ed0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8ee0: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8ef0: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8f00: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8f10: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8f20: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8f30: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8f40: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8f50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f60: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f70: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f80: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f90: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8fa0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8fb0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8fc0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8fd0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8fe0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8ff0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9000: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
9010: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
9020: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9030: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9040: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9050: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9060: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9070: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9080: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9090: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
90a0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
90b0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
90c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
90d0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
90e0: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
90f0: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
9100: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
9110: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
9120: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9130: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9140: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9150: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9160: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9170: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9180: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9190: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
91a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
91b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
91c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9200: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9210: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9230: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9240: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9250: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9260: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9270: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9280: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9290: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
92a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
92b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
92c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
92d0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
92e0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
92f0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
9300: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
9310: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
9320: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9330: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9340: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9350: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9360: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9370: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9380: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9390: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
93a0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
93b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
93c0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
93d0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
93e0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
93f0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9400: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
9410: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
9420: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9430: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9440: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9450: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9460: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9470: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9480: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9490: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
94a0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
94b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
94c0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
94d0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
94e0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
94f0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
9500: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
9510: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
9520: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9530: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9550: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9560: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9570: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9580: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9590: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
95a0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
95b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
95c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
95d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
95f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9600: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
9610: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
9620: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9630: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9640: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9650: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9660: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9670: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9680: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9690: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
96a0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
96b0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
96c0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
96d0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
96e0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
96f0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
9700: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
9710: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
9720: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9730: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9740: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9750: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9760: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9770: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9780: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9790: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
97a0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
97b0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
97c0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
97d0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
97e0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
97f0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
9800: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
9810: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
9820: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9830: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9850: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9860: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9880: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9890: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98d0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98e0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9900: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9910: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
9920: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9930: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9940: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9950: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9970: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9980: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
99a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
99b0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
99c0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
99d0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
99e0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
99f0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9a00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9a10: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9a30: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9a40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9a50: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a60: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a70: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9aa0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9ab0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9ac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9ad0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9ae0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9af0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9b00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9b10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9b20: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9b30: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9b40: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9b50: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b60: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b80: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b90: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9ba0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9bb0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9bc0: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9be0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9bf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9c20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9c30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9c40: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9c50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c60: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c70: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c80: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c90: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9ca0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9cc0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9cd0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9ce0: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9cf0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9d00: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9d10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9d20: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9d30: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9d40: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9d50: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d60: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d70: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d80: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d90: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9da0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9db0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9dc0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9dd0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9de0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9df0: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9e00: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9e10: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9e20: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9e30: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9e40: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9e50: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e60: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e70: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e80: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e90: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9ea0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9eb0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9ec0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ed0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9ee0: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9ef0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9f00: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9f10: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9f20: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9f30: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9f40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9f50: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f70: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f80: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9fb0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9fc0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9fd0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9fe0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9ff0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a000: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a010: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a020: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a030: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a040: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a050: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a060: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a080: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a090: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a0a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a0b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a0c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a0d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a0e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a0f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a100: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a110: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a120: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a130: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a140: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a150: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a160: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a170: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a180: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a1a0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a1b0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a1c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a1d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a1e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a1f0: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a200: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a210: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a220: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a230: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a250: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a260: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a270: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a280: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a290: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a2a0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2c0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a2d0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a2e0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a300: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a310: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a340: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a360: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a370: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a390: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a3a0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a3b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a3c0: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a3d0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a3e0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a3f0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a400: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a410: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a420: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a430: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a440: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a450: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a460: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a470: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a480: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a490: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a4a0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a4b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a4c0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a4d0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a4e0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a500: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a520: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a530: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a540: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a550: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a560: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a570: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a580: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a590: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a5a0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a5b0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a5c0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a5d0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a5e0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a5f0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a600: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a610: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a620: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a630: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a640: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a650: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a660: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a670: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a680: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a690: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a6a0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a6b0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a6c0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a6d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a6e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a6f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a700: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a710: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a720: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a730: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a740: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a750: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a760: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a780: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a790: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a7a0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a7b0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a7d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a7e0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a7f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a800: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a810: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a820: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a830: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a840: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a850: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a860: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a870: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a880: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a8a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a8b0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a8c0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a8d0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a8e0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a8f0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a900: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a910: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a920: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a930: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a940: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a950: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a960: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a970: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a980: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a990: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a9a0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a9b0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a9c0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a9d0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a9e0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a9f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
aa00: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
aa10: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa40: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
aa50: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa60: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa90: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aaa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aab0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aae0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aaf0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
ab00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
ab10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
ab20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ab30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ab40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ab50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
aba0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
abb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
abc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
abd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
ac00: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
ac10: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
ac20: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ac30: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ac40: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ac50: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac60: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac70: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac80: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac90: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
aca0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
acb0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
acc0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
acd0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ace0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
acf0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
ad00: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ad10: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
ad20: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ad30: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ad40: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ad50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad60: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad70: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad80: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ada0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
adb0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
adc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
add0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ade0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
adf0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
ae00: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
ae10: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
ae20: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ae30: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ae40: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae60: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae70: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae80: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae90: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
aea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
aeb0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
aec0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aed0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
aee0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
aef0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
af00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
af10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
af20: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
af30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
af40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af60: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af70: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af80: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af90: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
afb0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
afc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
afd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
afe0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
aff0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
b000: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b010: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
b020: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b030: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b040: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b050: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b060: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b070: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b080: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b090: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b0b0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b0c0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b0e0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b0f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b100: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b110: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b120: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b130: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b140: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b150: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b160: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b170: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b180: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b190: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b1a0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b1b0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b1c0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b1d0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b1e0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b1f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b200: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b210: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b220: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b230: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b240: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b250: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b270: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b280: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b290: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b2a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b2b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b2c0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b2d0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b2e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b2f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b300: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b310: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b320: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b330: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b340: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b350: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b360: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b370: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b380: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b390: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b3b0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b3c0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b3d0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b3e0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b3f0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b410: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b430: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b440: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b450: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b460: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b470: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b480: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b490: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b4a0: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b4b0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b4c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b4d0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b4e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b4f0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b500: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b510: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b520: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b530: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b540: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b560: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b570: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b580: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b590: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b5a0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b5b0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b5c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b5d0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b5e0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b5f0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b600: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b610: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b620: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b630: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b640: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b650: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b660: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b670: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b690: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b6a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b6d0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b6e0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b6f0: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b700: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b710: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b720: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b730: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b740: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b750: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b760: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b770: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b780: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b790: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b7a0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b7b0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b7c0: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b7d0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b7e0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b7f0: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b800: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b810: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b820: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b830: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b840: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b850: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b860: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b870: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b880: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b890: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b8a0: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b8b0: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b8c0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b8d0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b8e0: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b8f0: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b900: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b910: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b920: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b930: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b940: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b950: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b960: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b970: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b980: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b990: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b9a0: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b9d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b9e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b9f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ba00: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
ba10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
ba40: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
ba50: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba70: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba80: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
baa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bab0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bac0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bad0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bae0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
baf0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bb00: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bb10: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bb30: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bb40: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bb50: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb70: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb80: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bba0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bbb0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bbc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bbd0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bbe0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bbf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bc00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bc10: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bc20: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bc30: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bc40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bc50: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc70: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc90: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bca0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bcb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bcc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bcd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bcf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bd00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bd10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bd20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bd30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bd50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd90: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bda0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bdb0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bdc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bdd0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bde0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdf0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
be00: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
be10: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
be20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
be30: 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
be40: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
be50: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
be60: 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  *nCell;.  usable
be70: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
be80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
be90: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
bea0: 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69  handles pages wi
beb0: 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  th two or fewer 
bec0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20  free blocks and 
bed0: 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72  nMaxFrag.  ** or
bee0: 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65   fewer fragmente
bef0: 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73  d bytes. In this
bf00: 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74   case it is fast
bf10: 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20  er to move the. 
bf20: 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29   ** two (or one)
bf30: 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73   blocks of cells
bf40: 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29   using memmove()
bf50: 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71   and add the req
bf60: 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65  uired.  ** offse
bf70: 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74  ts to each point
bf80: 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  er in the cell-p
bf90: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61  ointer array tha
bfa0: 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a  n it is to .  **
bfb0: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
bfc0: 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a   entire page.  *
bfd0: 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74  /.  if( (int)dat
bfe0: 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72  a[hdr+7]<=nMaxFr
bff0: 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  ag ){.    int iF
c000: 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ree = get2byte(&
c010: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 0a 20  data[hdr+1]);.. 
c020: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69     /* If the ini
c030: 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b 20 6f  tial freeblock o
c040: 66 66 73 65 74 20 77 65 72 65 20 6f 75 74 20 6f  ffset were out o
c050: 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74 20 77  f bounds, that w
c060: 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 2a 2a  ould have.    **
c070: 20 62 65 65 6e 20 64 65 74 65 63 74 65 64 20 62   been detected b
c080: 79 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72  y btreeComputeFr
c090: 65 65 53 70 61 63 65 28 29 20 77 68 65 6e 20 69  eeSpace() when i
c0a0: 74 20 77 61 73 20 63 6f 6d 70 75 74 69 6e 67 20  t was computing 
c0b0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
c0c0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c0d0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  on the page. */.
c0e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
c0f0: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  e<=usableSize-4 
c100: 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  );.    if( iFree
c110: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46   ){.      int iF
c120: 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28  ree2 = get2byte(
c130: 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 20  &data[iFree]);. 
c140: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 3e       if( iFree2>
c150: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72  usableSize-4 ) r
c160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c170: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c180: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69  ;.      if( 0==i
c190: 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69  Free2 || (data[i
c1a0: 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74  Free2]==0 && dat
c1b0: 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20  a[iFree2+1]==0) 
c1c0: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
c1d0: 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  End = &data[cell
c1e0: 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
c1f0: 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ];.        u8 *p
c200: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Addr;.        in
c210: 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20  t sz2 = 0;.     
c220: 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32     int sz = get2
c230: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c240: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  +2]);.        in
c250: 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65  t top = get2byte
c260: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c270: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e          if( top>
c280: 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  =iFree ){.      
c290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2a0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
c2b0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
c2c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
c2d0: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
c2e0: 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46   if( iFree+sz>iF
c2f0: 72 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51  ree2 ) return SQ
c300: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c310: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c320: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
c330: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
c340: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2]);.          i
c350: 66 28 20 69 46 72 65 65 32 2b 73 7a 32 20 3e 20  f( iFree2+sz2 > 
c360: 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74  usableSize ) ret
c370: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c380: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c390: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
c3a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
c3b0: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
c3c0: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
c3d0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
c3e0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
c3f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c400: 66 28 20 69 46 72 65 65 2b 73 7a 3e 75 73 61 62  f( iFree+sz>usab
c410: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c420: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c430: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
c440: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
c450: 0a 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  ..        cbrk =
c460: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
c470: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
c480: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
c490: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
c4a0: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
c4b0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
c4c0: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
c4d0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
c4e0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
c4f0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
c500: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
c510: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
c520: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
c530: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
c540: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
c550: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
c560: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
c570: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
c580: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
c590: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
c5a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
c5b0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
c5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c5d0: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
c5e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
c5f0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c600: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c610: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c620: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c630: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c640: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c650: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c660: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c670: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c680: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c690: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c6a0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c6b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c6c0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c6d0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c6e0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c6f0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c700: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c710: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c720: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c730: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c740: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c750: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c760: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c780: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c790: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
c7a0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
c7b0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
c7c0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
c7d0: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
c7e0: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
c7f0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
c800: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
c810: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
c820: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c830: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c850: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
c870: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
c880: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
c890: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c8a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
c8b0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
c8c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
c8d0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
c8e0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c8f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c900: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
c910: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
c920: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
c930: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
c940: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
c950: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
c960: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
c970: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
c980: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
c990: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
c9a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
c9b0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
c9c0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
c9d0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
c9e0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
c9f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
ca00: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
ca10: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
ca20: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
ca30: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
ca40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ca50: 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Free>=0 );.  if(
ca60: 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72   data[hdr+7]+cbr
ca70: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
ca80: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
ca90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
caa0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
cab0: 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
cac0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
cad0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
cae0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
caf0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
cb00: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
cb10: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+2] = 0;.  m
cb20: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
cb30: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
cb40: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
cb50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
cb60: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
cb70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
cb80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
cb90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
cba0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d  Search the free-
cbb0: 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67  list on page pPg
cbc0: 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74   for space to st
cbd0: 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65  ore a cell nByte
cbe0: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
cbf0: 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65  e. If one can be
cc00: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61   found, return a
cc10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cc20: 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65  space and remove
cc30: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
cc40: 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
cc50: 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
cc60: 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75  space can be fou
cc70: 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  nd on the free-l
cc80: 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ist, return NULL
cc90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
cca0: 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74  ction may detect
ccb0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68   corruption with
ccc0: 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72  in pPg.  If corr
ccd0: 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  uption is.** det
cce0: 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20  ected then *pRc 
ccf0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
cd00: 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c  _CORRUPT and NUL
cd10: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
cd20: 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68  *.** Slots on th
cd30: 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74  e free list that
cd40: 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61   are between 1 a
cd50: 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65  nd 3 bytes large
cd60: 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20  r than nByte.** 
cd70: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
cd80: 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78  if adding the ex
cd90: 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65  tra space to the
cda0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
cdb0: 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74  ount.** causes t
cdc0: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
cdd0: 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64   count to exceed
cde0: 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75   60..*/.static u
cdf0: 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  8 *pageFindSlot(
ce00: 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  MemPage *pPg, in
ce10: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52  t nByte, int *pR
ce20: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  c){.  const int 
ce30: 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
ce40: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
ce50: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61   /* Offset to pa
ce60: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ge header */.  u
ce70: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
ce80: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20  = pPg->aData;   
ce90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
cea0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
ceb0: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
cee0: 73 20 6f 66 20 70 74 72 20 74 6f 20 70 63 20 2a  s of ptr to pc *
cef0: 2f 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74  /.  int pc = get
cf00: 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64  2byte(&aData[iAd
cf10: 64 72 5d 29 3b 20 20 20 20 20 20 20 20 20 20 2f  dr]);          /
cf20: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
cf30: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e  ree slot */.  in
cf40: 74 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  t x;            
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 65           /* Exce
cf70: 73 73 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73  ss size of the s
cf80: 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lot */.  int max
cf90: 50 43 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  PC = pPg->pBt->u
cfa0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 6e 42 79 74  sableSize - nByt
cfb0: 65 3b 20 20 2f 2a 20 4d 61 78 20 61 64 64 72 65  e;  /* Max addre
cfc0: 73 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20  ss for a usable 
cfd0: 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 73 69  slot */.  int si
cfe0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
d010: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
d020: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30  ..  assert( pc>0
d030: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c   );.  while( pc<
d040: 3d 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 2f 2a  =maxPC ){.    /*
d050: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d060: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
d070: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
d080: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
d090: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
d0a0: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
d0b0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
d0c0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
d0d0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
d0e0: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
d0f0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
d100: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
d110: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
d120: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
d130: 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69  .    if( (x = si
d140: 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29  ze - nByte)>=0 )
d150: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
d160: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
d170: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
d180: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 34 20  ;.      if( x<4 
d190: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
d1a0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
d1b0: 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65  98-58022 In a we
d1c0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
d1d0: 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c   page, the total
d1e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
d1f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66  er of bytes in f
d200: 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74  ragments may not
d210: 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20   exceed 60. */. 
d220: 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
d230: 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74  [hdr+7]>57 ) ret
d240: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  urn 0;..        
d250: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
d260: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
d270: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
d280: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
d290: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
d2a0: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
d2b0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
d2c0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
d2d0: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
d2e0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
d2f0: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
d300: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
d310: 65 6c 73 65 20 69 66 28 20 78 2b 70 63 20 3e 20  else if( x+pc > 
d320: 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 20 20 20  maxPC ){.       
d330: 20 2f 2a 20 54 68 69 73 20 73 6c 6f 74 20 65 78   /* This slot ex
d340: 74 65 6e 64 73 20 6f 66 66 20 74 68 65 20 65 6e  tends off the en
d350: 64 20 6f 66 20 74 68 65 20 75 73 61 62 6c 65 20  d of the usable 
d360: 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  part of the page
d370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 52 63   */.        *pRc
d380: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
d390: 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20  T_PAGE(pPg);.   
d3a0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
d3b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d3c0: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
d3d0: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
d3e0: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
d3f0: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
d400: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  ount.        ** 
d410: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
d420: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
d430: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
d440: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
d450: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
d460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d470: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
d480: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
d490: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
d4a0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
d4b0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  aData[pc]);.    
d4c0: 69 66 28 20 70 63 3c 3d 69 41 64 64 72 2b 73 69  if( pc<=iAddr+si
d4d0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
d4e0: 70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pc ){.        /*
d4f0: 20 54 68 65 20 6e 65 78 74 20 73 6c 6f 74 20 69   The next slot i
d500: 6e 20 74 68 65 20 63 68 61 69 6e 20 69 73 20 6e  n the chain is n
d510: 6f 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ot past the end 
d520: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
d530: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a  lot */.        *
d540: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d550: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
d570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
d580: 7d 0a 20 20 69 66 28 20 70 63 3e 6d 61 78 50 43  }.  if( pc>maxPC
d590: 2b 6e 42 79 74 65 2d 34 20 29 7b 0a 20 20 20 20  +nByte-4 ){.    
d5a0: 2f 2a 20 54 68 65 20 66 72 65 65 20 73 6c 6f 74  /* The free slot
d5b0: 20 63 68 61 69 6e 20 65 78 74 65 6e 64 73 20 6f   chain extends o
d5c0: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
d5d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 2a 70  e page */.    *p
d5e0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
d5f0: 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20  UPT_PAGE(pPg);. 
d600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
d610: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
d620: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
d630: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
d640: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
d650: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
d660: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d670: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
d680: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
d690: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
d6a0: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
d6b0: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
d6c0: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
d6d0: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
d6e0: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
d6f0: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
d700: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
d710: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
d720: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
d730: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
d740: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
d750: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
d760: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
d770: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
d780: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
d790: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
d7a0: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
d7b0: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
d7c0: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
d7d0: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
d7e0: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
d7f0: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
d800: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d810: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
d820: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
d830: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
d840: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
d850: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
d860: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
d870: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
d880: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
d890: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
d8a0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
d8b0: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
d8c0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
d8d0: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
d8e0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
d8f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d900: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
d910: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
d920: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
d930: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
d940: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d950: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d960: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d970: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d9a0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d9b0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d9c0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d9d0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d9f0: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
da00: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
da10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
da20: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
da30: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
da40: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
da50: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
da60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
da70: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
da80: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
da90: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
daa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
dab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
dac0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
dad0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
dae0: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
daf0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
db00: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
db10: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
db20: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
db30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
db40: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
db50: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
db60: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
db70: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
db80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
db90: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
dba0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
dbb0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
dbc0: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
dbd0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
dbe0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
dbf0: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
dc00: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
dc10: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
dc20: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
dc30: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
dc40: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
dc50: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
dc60: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
dc70: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
dc80: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
dc90: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
dca0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
dcb0: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
dcc0: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
dcd0: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
dce0: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
dcf0: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
dd00: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
dd10: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
dd20: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
dd30: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
dd40: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
dd50: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
dd60: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
dd70: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
dd80: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
dd90: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
dda0: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
ddb0: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
ddc0: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
ddd0: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
dde0: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
ddf0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
de00: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
de10: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
de20: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
de30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
de40: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
de50: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
de60: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
de70: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
de80: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
de90: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
dea0: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2c  re cell pointer,
deb0: 0a 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65  .  ** and if the
dec0: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
ded0: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
dee0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
def0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
df00: 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  r a slot big eno
df10: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
df20: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
df30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
df40: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
df50: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
df60: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
df70: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
df80: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
df90: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
dfa0: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
dfb0: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
dfc0: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
dfd0: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
dfe0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
dff0: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
e000: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
e010: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
e020: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
e030: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
e040: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
e050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e060: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
e070: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
e080: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e090: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
e0a0: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
e0b0: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
e0c0: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
e0d0: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
e0e0: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
e0f0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
e100: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
e110: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
e120: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
e130: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
e140: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
e150: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
e160: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
e170: 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
e180: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30   pPage->nFree>=0
e190: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   );.    rc = def
e1a0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
e1b0: 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d  e, MIN(4, pPage-
e1c0: 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74  >nFree - (2+nByt
e1d0: 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  e)));.    if( rc
e1e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e1f0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
e200: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
e210: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
e220: 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d  t( gap+2+nByte<=
e230: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
e240: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
e250: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
e260: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
e270: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
e280: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
e290: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
e2a0: 20 20 54 68 65 20 62 74 72 65 65 43 6f 6d 70 75    The btreeCompu
e2b0: 74 65 46 72 65 65 53 70 61 63 65 28 29 20 63 61  teFreeSpace() ca
e2c0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
e2d0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
e2e0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
e2f0: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
e300: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
e310: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
e320: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
e330: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
e340: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
e350: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
e360: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
e370: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
e380: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
e390: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
e3a0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
e3b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
e3c0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
e3d0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
e3e0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
e3f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
e400: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
e410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e430: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
e440: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
e450: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
e460: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
e470: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
e480: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
e490: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
e4a0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
e4b0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
e4c0: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
e4d0: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
e4e0: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
e4f0: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 6e  sced..**.** Even
e500: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
e510: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
e520: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 43  hecked by btreeC
e530: 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28  omputeFreeSpace(
e540: 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69  ),.** that routi
e550: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65  ne will not dete
e560: 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  ct overlap betwe
e570: 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  en cells or free
e580: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20  blocks.  Nor.** 
e590: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63  does it detect c
e5a0: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
e5b0: 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68  ks that encrouch
e5c0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76   into the reserv
e5d0: 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74  ed bytes.** at t
e5e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
e5f0: 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74  ge.  So do addit
e600: 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  ional corruption
e610: 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74   checks inside t
e620: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61  his.** routine a
e630: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e640: 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
e650: 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
e660: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
e670: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
e680: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20  age *pPage, u16 
e690: 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a  iStart, u16 iSiz
e6a0: 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20  e){.  u16 iPtr; 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e6d0: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
e6e0: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
e6f0: 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c  */.  u16 iFreeBl
e700: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
e710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
e720: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
e730: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
e740: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68         /* Page h
e770: 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f  eader size.  0 o
e780: 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46  r 100 */.  u8 nF
e790: 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rag = 0;        
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e   /* Reduction in
e7c0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a   fragmentation *
e7d0: 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a  /.  u16 iOrigSiz
e7e0: 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20  e = iSize;      
e7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
e800: 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69  ginal value of i
e810: 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b  Size */.  u16 x;
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
e850: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
e860: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
e870: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
e880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
e890: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
e8a0: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
e8b0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
e8c0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
e8d0: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
e8e0: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
e8f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e900: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
e910: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
e920: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
e930: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
e940: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
e950: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
e960: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
e970: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
e980: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
e990: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
e9a0: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
e9b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
e9c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e9d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e9e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e9f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
ea00: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
ea10: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
ea20: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
ea30: 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67  rt( iStart<=pPag
ea40: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ea50: 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ze-4 );..  /* Th
ea60: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
ea70: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
ea80: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
ea90: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
eaa0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
eab0: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
eac0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
ead0: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
eae0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
eaf0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
eb00: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
eb10: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
eb20: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
eb30: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
eb40: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
eb50: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
eb60: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
eb70: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
eb80: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
eb90: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
eba0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
ebb0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
ebc0: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
ebd0: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
ebe0: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
ebf0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
ec00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ec10: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
ec20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ec30: 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b  iPtr = iFreeBlk;
ec40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ec50: 46 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70  FreeBlk>pPage->p
ec60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
ec70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ec80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ec90: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
eca0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
ecb0: 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20  FreeBlk>iPtr || 
ecc0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20  iFreeBlk==0 );. 
ecd0: 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73   .    /* At this
ece0: 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20   point:.    **  
ecf0: 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69    iFreeBlk:   Fi
ed00: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66  rst freeblock af
ed10: 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a  ter iStart, or z
ed20: 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20  ero if none.    
ed30: 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20  **    iPtr:     
ed40: 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66    The address of
ed50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46   a pointer to iF
ed60: 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20  reeBlk.    **.  
ed70: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
ed80: 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68  e if iFreeBlk sh
ed90: 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65  ould be coalesce
eda0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
edb0: 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f  f iStart..    */
edc0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
edd0: 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72  k && iEnd+3>=iFr
ede0: 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e  eeBlk ){.      n
edf0: 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20  Frag = iFreeBlk 
ee00: 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66  - iEnd;.      if
ee10: 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20  ( iEnd>iFreeBlk 
ee20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ee30: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
ee40: 67 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  ge);.      iEnd 
ee50: 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74  = iFreeBlk + get
ee60: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
ee70: 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20  eBlk+2]);.      
ee80: 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65  if( iEnd > pPage
ee90: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
eea0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
eeb0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
eec0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
eed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
eee0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
eef0: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
ef00: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
ef10: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
ef20: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
ef30: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
ef40: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
ef50: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
ef60: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
ef70: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
ef80: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
ef90: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
efa0: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
efb0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
efc0: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
efd0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
efe0: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
eff0: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
f000: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
f010: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
f020: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
f030: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
f040: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
f050: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f060: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
f070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f080: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
f090: 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  e);.        nFra
f0a0: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
f0b0: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
f0c0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
f0d0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
f0e0: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
f0f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
f100: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
f110: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
f120: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
f130: 70 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61  pPage);.    data
f140: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
f150: 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32  ;.  }.  x = get2
f160: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
f170: 5d 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74  ]);.  if( iStart
f180: 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  <=x ){.    /* Th
f190: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
f1a0: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
f1b0: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
f1c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
f1d0: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
f1e0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
f1f0: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
f200: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
f210: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
f220: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
f230: 20 20 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c    if( iStart<x |
f240: 7c 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  | iPtr!=hdr+1 ) 
f250: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f260: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
f270: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
f280: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46  &data[hdr+1], iF
f290: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
f2a0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f2b0: 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c  5], iEnd);.  }el
f2c0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  se{.    /* Inser
f2d0: 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c  t the new freebl
f2e0: 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65  ock into the fre
f2f0: 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74  elist */.    put
f300: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
f310: 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a  ], iStart);.  }.
f320: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
f330: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
f340: 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a  _FAST_SECURE ){.
f350: 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
f360: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
f370: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
f380: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
f390: 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70  delete.    ** op
f3a0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
f3b0: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  */.    memset(&d
f3c0: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
f3d0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75  iSize);.  }.  pu
f3e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
f3f0: 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  art], iFreeBlk);
f400: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
f410: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
f420: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
f430: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
f440: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f450: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
f460: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
f470: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
f480: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
f490: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
f4a0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
f4b0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
f4c0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
f4d0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
f4e0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
f4f0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
f500: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
f510: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
f520: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
f530: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
f540: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
f550: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
f560: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
f570: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
f580: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
f590: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
f5a0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f5b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
f5c0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
f5d0: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
f5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
f5f0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
f600: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
f610: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
f620: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
f630: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
f640: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
f650: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
f660: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
f670: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
f680: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
f690: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
f6a0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
f6b0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
f6c0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
f6d0: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
f6e0: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
f6f0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
f700: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
f710: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
f720: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
f730: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
f740: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
f750: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
f760: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
f770: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
f780: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
f790: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
f7a0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f7b0: 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38  F: R-07291-35328
f7c0: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30   A value of 5 (0
f7d0: 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x05) means the p
f7e0: 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  age is an.    **
f7f0: 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20   interior table 
f800: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
f810: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
f820: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
f830: 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20  TKEY)==5 );.    
f840: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f850: 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20  R-26900-09176 A 
f860: 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30  value of 13 (0x0
f870: 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  d) means the pag
f880: 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65  e is a.    ** le
f890: 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  af table b-tree 
f8a0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f8b0: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
f8c0: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  TA|PTF_INTKEY|PT
f8d0: 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20  F_LEAF)==13 );. 
f8e0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f8f0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
f900: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
f910: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f920: 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  Leaf = 1;.      
f930: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
f940: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
f950: 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65  llPtr;.    }else
f960: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
f970: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f980: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c       pPage->xCel
f990: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
f9a0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
f9b0: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
f9c0: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
f9d0: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
f9e0: 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ad;.    }.    pP
f9f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
fa00: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
fa10: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
fa20: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
fa30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
fa40: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
fa50: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
fa60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
fa70: 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75  316-37308 A valu
fa80: 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65  e of 2 (0x02) me
fa90: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
faa0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
fab0: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  or index b-tree 
fac0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
fad0: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
fae0: 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a  TA)==2 );.    /*
faf0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fb00: 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61  59615-42828 A va
fb10: 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29  lue of 10 (0x0a)
fb20: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
fb30: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
fb40: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
fb50: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
fb60: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
fb70: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29  |PTF_LEAF)==10 )
fb80: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
fb90: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
fba0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
fbb0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78   0;.    pPage->x
fbc0: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
fbd0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
fbe0: 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  ex;.    pPage->m
fbf0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
fc00: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
fc10: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
fc20: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
fc30: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
fc40: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36  IDENCE-OF: R-476
fc50: 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68  08-56469 Any oth
fc60: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  er value for the
fc70: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
fc80: 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65  e is.    ** an e
fc90: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74  rror. */.    ret
fca0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fcb0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
fcc0: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
fcd0: 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
fce0: 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
fcf0: 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
fd00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fd10: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 6d  * Compute the am
fd20: 6f 75 6e 74 20 6f 66 20 66 72 65 65 73 70 61 63  ount of freespac
fd30: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  e on the page.  
fd40: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
fd50: 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74 68 65 20 70  fill.** in the p
fd60: 50 61 67 65 2d 3e 6e 46 72 65 65 20 66 69 65 6c  Page->nFree fiel
fd70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fd80: 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65   btreeComputeFre
fd90: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
fda0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63  pPage){.  int pc
fdb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fdc0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
fdd0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
fde0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
fdf0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
fe00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
fe10: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
fe20: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
fe30: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
fe40: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
fe50: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
fe60: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
fe70: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
fe80: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
fe90: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
fea0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
feb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fec0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
fed0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
fee0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
fef0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ff00: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ff10: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
ff20: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
ff30: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
ff40: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
ff50: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
ff60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
ff70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
ff80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
ff90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
ffa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
ffb0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
ffc0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
ffd0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
ffe0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fff0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
10000 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10010 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10020 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
10030 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
10040 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
10050 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
10060 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
10070 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10080 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
10090 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
100a0 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
100b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
100c0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
100d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
100e0 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  nit==1 );.  asse
100f0 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
10100 3c 30 20 29 3b 0a 0a 20 20 75 73 61 62 6c 65 53  <0 );..  usableS
10110 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
10120 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
10130 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
10140 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d  Offset;.  data =
10150 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10160 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10170 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
10180 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
10190 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
101a0 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20  designates.  ** 
101b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
101c0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
101d0 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
101e0 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
101f0 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70  r is.  ** interp
10200 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
10210 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
10220 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
10230 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 43 65 6c  [hdr+5]);.  iCel
10240 6c 46 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38  lFirst = hdr + 8
10250 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
10260 74 72 53 69 7a 65 20 2b 20 32 2a 70 50 61 67 65  trSize + 2*pPage
10270 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  ->nCell;.  iCell
10280 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
10290 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  e - 4;..  /* Com
102a0 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
102b0 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
102c0 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45   page.  ** EVIDE
102d0 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d  NCE-OF: R-23588-
102e0 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79  34450 The two-by
102f0 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
10300 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65  fset 1 gives the
10310 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74  .  ** start of t
10320 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10330 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
10340 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
10350 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
10360 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
10370 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
10380 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
10390 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
103a0 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
103b0 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
103c0 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
103d0 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70  space */.  if( p
103e0 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  c>0 ){.    u32 n
103f0 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
10400 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10410 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
10420 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
10430 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
10440 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
10450 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
10460 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  .      ** always
10470 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
10480 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10490 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
104a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
104b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
104c0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
104d0 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77  e); .    }.    w
104e0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
104f0 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73   if( pc>iCellLas
10500 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
10510 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68  Freeblock off th
10520 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
10530 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
10540 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10550 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
10570 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
10580 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
10590 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
105a0 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
105b0 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
105c0 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
105d0 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
105e0 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
105f0 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
10600 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74    }.    if( next
10610 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  >0 ){.      /* F
10620 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
10630 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
10640 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10650 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10660 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10670 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a  }.    if( pc+siz
10680 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10690 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
106a0 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65      /* Last free
106b0 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61  block extends pa
106c0 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20  st page end */. 
106d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
106e0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
106f0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
10700 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
10710 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
10720 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
10730 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10740 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
10750 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10760 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10770 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10780 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a  ytes within.  **
10790 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
107a0 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
107b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
107c0 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
107d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
107e0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
107f0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
10800 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
10810 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74  so.  ** serves t
10820 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
10830 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10840 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10850 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61  l-content.  ** a
10860 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
10870 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
10880 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
10890 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  he page..  */.  
108a0 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
108b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
108c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
108d0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
108e0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
108f0 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
10900 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
10910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10920 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  K;.}../*.** Do a
10930 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
10940 20 63 68 65 63 6b 20 61 66 74 65 72 20 62 74 72   check after btr
10950 65 65 49 6e 69 74 50 61 67 65 28 29 20 69 66 0a  eeInitPage() if.
10960 2a 2a 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73  ** PRAGMA cell_s
10970 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 20 0a 2a 2f  ize_check=ON .*/
10980 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
10990 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
109a0 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28 4d  eCellSizeCheck(M
109b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
109c0 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
109d0 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
109e0 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
109f0 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
10a00 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
10a10 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
10a20 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
10a30 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
10a40 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  et */.  int i;  
10a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10a60 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
10a70 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
10a80 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20 20 20  */.  int sz;    
10a90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10aa0 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
10ab0 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
10ac0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10ad0 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
10ae0 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
10af0 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
10b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
10b10 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
10b20 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ta */.  int usab
10b30 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 4d 61  leSize;    /* Ma
10b40 78 69 6d 75 6d 20 75 73 61 62 6c 65 20 73 70 61  ximum usable spa
10b50 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
10b60 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
10b70 65 74 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20  et;    /* Start 
10b80 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
10b90 61 72 65 61 20 2a 2f 0a 0a 20 20 69 43 65 6c 6c  area */..  iCell
10ba0 46 69 72 73 74 20 3d 20 70 50 61 67 65 2d 3e 63  First = pPage->c
10bb0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
10bc0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 75 73  age->nCell;.  us
10bd0 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
10be0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
10bf0 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
10c00 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
10c10 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
10c20 3e 61 44 61 74 61 3b 0a 20 20 63 65 6c 6c 4f 66  >aData;.  cellOf
10c30 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
10c40 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20  llOffset;.  if( 
10c50 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
10c60 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 66 6f  CellLast--;.  fo
10c70 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
10c80 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
10c90 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
10ca0 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
10cb0 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
10cc0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10cd0 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
10ce0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
10cf0 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
10d00 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
10d10 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
10d20 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
10d30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10d40 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10d50 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 70 50     }.    sz = pP
10d60 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
10d70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
10d80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10d90 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
10da0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 63 2b  e );.    if( pc+
10db0 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
10dc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10dd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10de0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
10df0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10e00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10e10 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10e20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
10e30 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
10e40 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
10e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10e60 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
10e70 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
10e80 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
10e90 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
10ea0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
10eb0 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
10ec0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
10ed0 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
10ee0 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
10ef0 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
10f00 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
10f10 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
10f20 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
10f30 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
10f40 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
10f50 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
10f60 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
10f70 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
10f80 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
10f90 7b 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  {.  u8 *data;   
10fa0 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
10fb0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
10fc0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
10fd0 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
10fe0 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
10ff0 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 61 73 73  ucture */..  ass
11000 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
11010 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11020 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
11030 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
11040 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11050 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
11060 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11070 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
11080 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
11090 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
110a0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
110b0 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
110c0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
110d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
110e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
110f0 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
11100 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11110 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11120 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
11130 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Page->isInit==0 
11140 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67  );..  pBt = pPag
11150 65 2d 3e 70 42 74 3b 0a 20 20 64 61 74 61 20 3d  e->pBt;.  data =
11160 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20   pPage->aData + 
11170 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11180 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
11190 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39  OF: R-28594-0289
111a0 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66  0 The one-byte f
111b0 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20  lag at offset 0 
111c0 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20  indicating.  ** 
111d0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
111e0 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64  type. */.  if( d
111f0 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
11200 2c 20 64 61 74 61 5b 30 5d 29 20 29 7b 0a 20 20  , data[0]) ){.  
11210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11220 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
11230 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
11240 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
11250 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
11260 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
11270 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
11280 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
11290 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
112a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
112b0 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
112c0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
112d0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
112e0 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
112f0 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  PtrSize;.  pPage
11300 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 64 61 74  ->aCellIdx = dat
11310 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  a + pPage->child
11320 50 74 72 53 69 7a 65 20 2b 20 38 3b 0a 20 20 70  PtrSize + 8;.  p
11330 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
11340 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20   pPage->aData + 
11350 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
11360 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
11370 66 73 74 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  fst = pPage->aDa
11380 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ta + pPage->chil
11390 64 50 74 72 53 69 7a 65 3b 0a 20 20 2f 2a 20 45  dPtrSize;.  /* E
113a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
113b0 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
113c0 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
113d0 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
113e0 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
113f0 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
11400 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67   page. */.  pPag
11410 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
11420 79 74 65 28 26 64 61 74 61 5b 33 5d 29 3b 0a 20  yte(&data[3]);. 
11430 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
11440 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
11450 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
11460 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
11470 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
11480 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
11490 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
114a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
114b0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
114c0 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  }.  testcase( pP
114d0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
114e0 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a  ELL(pBt) );.  /*
114f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11500 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
11510 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
11520 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
11530 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73  s only.  ** poss
11540 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
11550 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
11560 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
11570 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
11580 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
11590 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
115a0 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
115b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
115c0 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74  nus the.  ** byt
115d0 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
115e0 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  pace. */.  asser
115f0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
11600 30 0a 20 20 20 20 20 20 20 7c 7c 20 67 65 74 32  0.       || get2
11610 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
11620 61 5b 35 5d 29 3d 3d 28 69 6e 74 29 70 42 74 2d  a[5])==(int)pBt-
11630 3e 75 73 61 62 6c 65 53 69 7a 65 0a 20 20 20 20  >usableSize.    
11640 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
11650 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   );.  pPage->nFr
11660 65 65 20 3d 20 2d 31 3b 20 20 2f 2a 20 49 6e 64  ee = -1;  /* Ind
11670 69 63 61 74 65 20 74 68 61 74 20 74 68 69 73 20  icate that this 
11680 76 61 6c 75 65 20 69 73 20 79 65 74 20 75 6e 63  value is yet unc
11690 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20 70 50 61  omputed */.  pPa
116a0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
116b0 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
116c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
116d0 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
116e0 72 65 74 75 72 6e 20 62 74 72 65 65 43 65 6c 6c  return btreeCell
116f0 53 69 7a 65 43 68 65 63 6b 28 70 50 61 67 65 29  SizeCheck(pPage)
11700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11710 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11720 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
11730 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
11740 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
11750 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
11760 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
11770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11780 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
11790 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
117a0 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
117b0 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
117c0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
117d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
117e0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
117f0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
11800 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
11810 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
11820 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
11830 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
11840 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
11850 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
11860 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11870 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
11880 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
11890 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
118a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
118b0 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
118c0 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
118d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
118e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
118f0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
11900 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
11910 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11920 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11930 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
11940 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
11950 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d  _SECURE ){.    m
11960 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
11970 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
11980 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
11990 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
119a0 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
119b0 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
119c0 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
119d0 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
119e0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
119f0 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
11a00 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
11a10 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
11a20 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
11a30 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
11a40 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
11a50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
11a60 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
11a70 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
11a80 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
11a90 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
11aa0 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
11ab0 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
11ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
11ad0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
11ae0 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
11af0 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
11b00 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
11b10 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
11b20 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
11b30 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
11b40 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
11b50 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
11b60 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
11b70 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
11b80 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
11b90 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
11ba0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
11bb0 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
11bc0 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
11bd0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
11be0 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
11bf0 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
11c00 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
11c10 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
11c20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
11c30 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
11c40 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
11c50 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
11c60 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
11c70 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
11c80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
11c90 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
11ca0 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
11cb0 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  age);.  if( pgno
11cc0 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b  !=pPage->pgno ){
11cd0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
11ce0 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
11cf0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
11d00 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62  ;.    pPage->pDb
11d10 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
11d20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
11d30 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d   pBt;.    pPage-
11d40 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
11d50 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
11d60 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
11d70 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73  00 : 0;.  }.  as
11d80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
11d90 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
11da0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
11db0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11dc0 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
11dd0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
11de0 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
11df0 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
11e00 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
11e10 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
11e20 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53  ts if needed.  S
11e30 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65  ee also: btreeGe
11e40 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a  tUnusedPage()..*
11e50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45  *.** If the PAGE
11e60 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
11e70 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
11e80 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
11e90 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f   not care.** abo
11ea0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
11eb0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
11ec0 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
11ed0 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
11ee0 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
11ef0 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
11f00 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
11f10 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
11f20 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
11f30 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
11f40 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
11f50 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
11f60 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
11f70 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
11f80 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
11f90 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
11fa0 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
11fb0 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
11fc0 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
11fd0 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
11fe0 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
11ff0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12000 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
12010 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
12020 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
12030 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
12040 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
12050 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
12060 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
12070 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
12080 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
12090 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
120a0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
120b0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
120c0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
120d0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
120e0 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
120f0 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
12100 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
12110 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
12120 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
12130 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
12140 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
12150 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12160 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12170 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
12180 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
12190 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
121a0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
121b0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
121c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
121d0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
121e0 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
121f0 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12200 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
12210 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12220 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
12230 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
12240 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
12250 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
12260 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
12270 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
12280 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
12290 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
122a0 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
122b0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
122c0 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
122d0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
122e0 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
122f0 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
12300 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
12310 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
12320 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
12330 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12340 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12350 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
12360 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
12370 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
12380 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
12390 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
123a0 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
123b0 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
123c0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
123d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
123e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
123f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
12400 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
12410 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
12420 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
12430 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
12440 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
12450 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
12460 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
12470 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
12480 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
12490 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
124a0 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
124b0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
124c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
124d0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
124e0 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
124f0 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
12500 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
12510 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f  turn btreePageco
12520 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
12530 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
12540 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
12550 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
12560 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72  t..**.** If pCur
12570 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
12580 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68  e is being fetch
12590 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
125a0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a  moveToChild().**
125b0 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74   call.  Do addit
125c0 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
125d0 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
125e0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
125f0 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65  ** And if the fe
12600 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20  tch fails, this 
12610 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63  routine must dec
12620 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61  rement pCur->iPa
12630 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
12640 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73  ge is fetched as
12650 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65   read-write unle
12660 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e  ss pCur is not N
12670 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20  ULL and is.** a 
12680 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
12690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
126a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
126b0 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65   *ppPage is unde
126c0 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
126d0 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
126e0 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
126f0 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
12700 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
12710 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
12720 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
12730 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
12740 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12760 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12790 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
127a0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
127b0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
127c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
127d0 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
127e0 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ere */.  BtCurso
127f0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
12800 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
12810 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  or to receive th
12820 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20  e page, or NULL 
12830 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e  */.  int bReadOn
12840 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
12850 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
12860 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67   a read-only pag
12870 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
12880 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
12890 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
128a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
128b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
128c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
128d0 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70  =0 || ppPage==&p
128e0 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
128f0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
12900 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43  || bReadOnly==pC
12910 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
12920 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
12930 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  Cur==0 || pCur->
12940 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66  iPage>0 );..  if
12950 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
12960 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
12970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
12980 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12990 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
129a0 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a  age_error1;.  }.
129b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
129c0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
129d0 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
129e0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52  e**)&pDbPage, bR
129f0 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20  eadOnly);.  if( 
12a00 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67  rc ){.    goto g
12a10 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12a20 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  ror1;.  }.  *ppP
12a30 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
12a40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
12a50 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
12a60 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
12a70 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
12a80 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
12a90 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
12aa0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63  no, pBt);.    rc
12ab0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
12ac0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
12ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ae0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67   ){.      goto g
12af0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12b00 72 6f 72 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ror2;.    }.  }.
12b10 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
12b20 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
12b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
12b40 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73  pPage)->aData==s
12b50 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12b60 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  ta(pDbPage) );..
12b70 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e    /* If obtainin
12b80 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66  g a child page f
12b90 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20  or a cursor, we 
12ba0 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74  must verify that
12bb0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a   the page is.  *
12bc0 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  * compatible wit
12bd0 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  h the root page.
12be0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26   */.  if( pCur &
12bf0 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43  & ((*ppPage)->nC
12c00 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67  ell<1 || (*ppPag
12c10 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  e)->intKey!=pCur
12c20 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a  ->curIntKey) ){.
12c30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12c40 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e  CORRUPT_PGNO(pgn
12c50 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  o);.    goto get
12c60 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12c70 72 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r2;.  }.  return
12c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
12c90 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12ca0 72 32 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  r2:.  releasePag
12cb0 65 28 2a 70 70 50 61 67 65 29 3b 0a 67 65 74 41  e(*ppPage);.getA
12cc0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12cd0 31 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  1:.  if( pCur ){
12ce0 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
12cf0 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  --;.    pCur->pP
12d00 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
12d10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
12d20 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
12d30 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
12d40 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
12d50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
12d60 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
12d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
12d80 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
12d90 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
12da0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
12db0 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
12dc0 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
12dd0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20  ge..**.** Page1 
12de0 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  is a special cas
12df0 65 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  e and must be re
12e00 6c 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c  leased using rel
12e10 65 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a  easePageOne()..*
12e20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
12e30 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
12e40 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12e50 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
12e60 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
12e70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
12e80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12e90 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
12ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12eb0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
12ec0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
12ed0 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
12ee0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
12ef0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12f00 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
12f10 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
12f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12f30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12f40 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12f50 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
12f60 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
12f70 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
12f80 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
12f90 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
12fa0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12fb0 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
12fc0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
12fd0 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
12fe0 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12ff0 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  One(MemPage *pPa
13000 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
13010 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
13020 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13030 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
13040 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
13050 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
13060 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
13070 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13080 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
13090 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
130a0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
130b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
130c0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
130d0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
130e0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
130f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13100 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
13110 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
13120 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
13130 72 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65  refPageOne(pPage
13140 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ->pDbPage);.}../
13150 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
13160 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
13170 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
13180 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
13190 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
131a0 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
131b0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
131c0 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
131d0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
131e0 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
131f0 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
13200 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
13210 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
13220 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
13230 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
13240 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
13250 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
13260 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
13270 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
13280 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
13290 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
132a0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
132b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
132c0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
132d0 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
132e0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
132f0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
13300 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
13310 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
13320 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
13330 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
13340 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
13350 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
13360 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
13370 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
13380 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
13390 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
133a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
133b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
133c0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
133d0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
133e0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
133f0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
13400 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
13410 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
13420 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
13430 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
13440 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
13450 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
13460 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
13470 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13480 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
13490 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
134a0 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
134b0 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
134c0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
134d0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
134e0 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
134f0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
13500 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
13510 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
13520 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
13530 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
13540 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
13550 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
13560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
13570 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
13580 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
13590 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
135a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
135b0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
135c0 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
135d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
135e0 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
135f0 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
13600 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
13610 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
13620 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
13630 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
13640 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13650 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
13660 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
13670 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
13680 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
13690 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
136a0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
136b0 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
136c0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
136d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
136e0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
136f0 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
13700 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
13710 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
13720 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
13730 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
13740 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
13750 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
13760 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
13770 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
13780 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
13790 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
137a0 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
137b0 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
137c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
137d0 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
137e0 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
137f0 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
13800 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
13810 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
13820 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
13830 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
13840 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
13850 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
13860 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
13870 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
13880 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
13890 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
138a0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
138b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
138c0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
138d0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
138e0 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
138f0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
13900 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
13910 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
13920 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
13930 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
13940 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
13950 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
13960 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13970 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
13980 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
13990 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
139a0 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
139b0 3e 62 75 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20  >busyHandler,.  
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
139f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a  (pBt->pPager));.
13a00 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
13a10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
13a20 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
13a30 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
13a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a50 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
13a60 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
13a70 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
13a80 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
13a90 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
13aa0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
13ab0 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
13ac0 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
13ad0 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
13ae0 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
13af0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
13b00 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
13b10 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
13b20 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
13b30 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
13b40 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
13b50 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
13b60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
13b70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
13b80 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
13b90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
13ba0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
13bb0 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
13bc0 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
13bd0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
13be0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
13bf0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
13c00 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
13c10 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
13c20 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
13c30 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
13c40 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
13c50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
13c60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
13c70 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
13c80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
13c90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
13ca0 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
13cb0 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
13cc0 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
13cd0 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
13ce0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13cf0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
13d00 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
13d10 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
13d20 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
13d30 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
13d40 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
13d50 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
13d60 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
13d70 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
13d80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13d90 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
13da0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
13db0 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
13dc0 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
13dd0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13de0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
13df0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
13e00 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
13e10 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
13e20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
13e30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
13e40 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
13e50 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
13e60 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
13e70 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
13e80 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
13e90 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
13ea0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
13eb0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13ec0 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
13ed0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13ef0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
13f00 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
13f10 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
13f20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13f30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13f40 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
13f50 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
13f60 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
13f90 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
13fa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
13fb0 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
13fc0 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
13fd0 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
13fe0 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
13ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14000 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14010 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
14020 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
14030 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
14060 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
14070 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
14080 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
14090 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
140a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
140b0 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
140c0 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
140d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
140e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
140f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
14100 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
14110 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
14120 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
14130 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
14140 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
14150 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
14160 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
14170 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
14180 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
14190 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
141a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
141b0 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
141c0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
141d0 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
141e0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
141f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
14200 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
14210 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
14240 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
14250 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
14280 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
14290 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
142a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
142b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
142c0 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
142d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
142e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
142f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
14300 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
14310 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
14320 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
14330 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
14340 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
14350 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
14360 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
14370 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
14380 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
14390 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
143a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
143b0 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
143c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
143d0 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
143e0 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
143f0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
14400 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
14410 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
14420 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
14430 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
14440 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
14450 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
14460 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
14470 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
14480 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
14490 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
144a0 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
144b0 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
144c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
144d0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
144e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
144f0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
14500 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
14510 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
14520 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
14530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14540 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
14550 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
14560 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
14570 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
14580 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
14590 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
145a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
145b0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
145c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
145d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
145e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
145f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
14600 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
14610 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
14620 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
14630 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
14640 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
14650 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
14660 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
14670 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
14680 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
14690 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
146a0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
146b0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
146c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
146d0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
146e0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
146f0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
14700 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
14710 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
14720 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
14730 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
14740 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
14750 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
14760 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
14770 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
14780 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
14790 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
147a0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
147b0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
147c0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
147d0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
147e0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
147f0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
14800 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
14810 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
14820 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
14830 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14840 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14860 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
14870 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
14880 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
14890 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
148a0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
148b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
148c0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
148d0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
148e0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
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 6e 46 75 6c 6c 50 61 74          nFullPat
14910 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
14920 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
14930 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14940 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14950 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
14960 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14970 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
14980 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
149a0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
149b0 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
149c0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
149d0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
149e0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
149f0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
14a00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14a10 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
14a20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
14a30 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14a40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14a50 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
14a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14a70 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
14a80 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
14a90 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
14aa0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14ab0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14ac0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
14ad0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
14ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
14af0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
14b00 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
14b10 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
14b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
14b30 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
14b40 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
14b50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
14b60 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
14b70 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
14b80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
14b90 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
14ba0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
14bb0 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
14bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
14bd0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
14be0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
14bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14c00 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
14c10 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
14c20 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14c30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14c40 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14c50 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
14c60 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14c70 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14c80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
14c90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14ca0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14cc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14ce0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
14cf0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
14d00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
14d10 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
14d20 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
14d30 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
14d40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14d60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
14d70 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14d80 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14d90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
14da0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
14db0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14dc0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
14dd0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
14de0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
14df0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
14e00 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
14e10 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
14e20 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
14e30 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
14e40 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
14e50 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
14e60 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
14e70 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
14e80 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
14e90 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
14ea0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
14eb0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
14ec0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
14ed0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
14ee0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
14ef0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
14f00 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
14f10 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
14f20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14f30 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
14f40 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
14f50 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
14f60 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
14f70 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
14f80 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
14f90 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
14fa0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
14fb0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
14fc0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
14fd0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
14fe0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
14ff0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
15000 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
15010 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
15020 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
15030 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
15040 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
15050 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
15060 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15070 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
15080 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
15090 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
150a0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
150b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
150c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
150d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
150e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
150f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
15100 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
15110 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
15120 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
15130 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65         sizeof(Me
15160 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76  mPage), flags, v
15170 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
15180 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
15190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
151a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
151b0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
151c0 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
151d0 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
151e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
151f0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
15200 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
15210 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
15220 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
15230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
15250 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
15270 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
15280 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
15290 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
152a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
152b0 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yHandler(pBt->pP
152c0 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
152d0 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
152e0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
152f0 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
15300 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
15310 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
15320 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
15330 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
15340 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
15350 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
15360 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
15370 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
15380 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
15390 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
153a0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
153b0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69  URE_DELETE;.#eli
153c0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
153d0 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c  _FAST_SECURE_DEL
153e0 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74  ETE).    pBt->bt
153f0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56  sFlags |= BTS_OV
15400 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  ERWRITE;.#endif.
15410 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15420 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
15430 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
15440 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
15450 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
15460 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
15470 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
15480 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
15490 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
154a0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
154b0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
154c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
154d0 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
154e0 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
154f0 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
15500 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
15510 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
15520 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
15530 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
15540 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
15550 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
15560 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
15570 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
15580 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
15590 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
155a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
155b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
155c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
155d0 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
155e0 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
155f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
15600 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
15610 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
15620 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
15630 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
15640 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
15650 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
15660 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
15670 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
15680 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
15690 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
156a0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
156b0 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
156c0 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
156d0 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
156e0 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
156f0 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
15700 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
15710 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
15720 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
15730 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15740 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
15750 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
15760 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
15770 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
15780 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
15790 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
157a0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
157b0 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
157c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
157d0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
157e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
157f0 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
15800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
15810 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
15820 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
15830 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
15840 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
15850 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
15860 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
15870 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
15880 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
15890 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
158a0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
158b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
158c0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
158d0 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
158e0 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
158f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15900 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
15910 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
15920 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15930 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
15940 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
15950 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
15960 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
15970 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15980 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15990 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
159a0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
159b0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
159c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
159d0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
159e0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
159f0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
15a00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
15a10 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
15a20 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
15a30 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
15a40 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
15a50 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
15a60 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
15a70 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
15a80 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
15a90 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
15aa0 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
15ab0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15ac0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
15ad0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15ae0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
15af0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
15b00 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
15b10 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
15b20 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
15b30 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
15b40 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
15b50 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
15b60 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
15b70 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15b80 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
15b90 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54  red; ).      MUT
15ba0 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
15bb0 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
15bc0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15bd0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15be0 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
15bf0 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
15c00 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
15c10 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
15c20 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
15c30 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
15c40 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15c50 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
15c60 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
15c70 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
15c80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15c90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15ca0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
15cb0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15cd0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15ce0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
15cf0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
15d00 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
15d10 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15d20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15d30 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
15d40 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15d50 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15d60 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
15d70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15d80 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
15d90 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
15da0 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
15db0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15dc0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
15dd0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15de0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15df0 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
15e00 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
15e10 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
15e20 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
15e30 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
15e40 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
15e50 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
15e60 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
15e70 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
15e80 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
15e90 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
15ea0 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
15eb0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
15ec0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
15ed0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
15ee0 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
15ef0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
15f00 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
15f10 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
15f20 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
15f30 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
15f40 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
15f50 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
15f60 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
15f70 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
15f80 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c  f( (uptr)p->pBt<
15f90 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20  (uptr)pSib->pBt 
15fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15fb0 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
15fc0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
15fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15fe0 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
15ff0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16000 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
16010 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
16020 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78  (uptr)pSib->pNex
16030 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e  t->pBt<(uptr)p->
16040 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
16050 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
16060 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
16070 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
16080 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
16090 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
160a0 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
160b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
160c0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
160d0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
160e0 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
160f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16100 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
16110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16130 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
16140 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
16150 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
16160 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
16170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16180 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
16190 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
161a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
161b0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
161c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
161d0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
161e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
161f0 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
16200 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
16210 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
16220 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a   *pFile;..    /*
16230 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
16240 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
16250 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
16260 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
16270 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
16280 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
16290 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
162a0 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
162b0 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
162c0 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
162d0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
162e0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
162f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16300 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
16310 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
16320 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
16330 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
16340 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
16350 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16360 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
16370 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20   }..    pFile = 
16380 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
16390 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
163a0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
163b0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
163c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
163d0 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20  trolHint(pFile, 
163e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42  SQLITE_FCNTL_PDB
163f0 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64  , (void*)&pBt->d
16400 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
16410 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
16420 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
16430 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16440 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
16450 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16460 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
16470 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
16490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
164a0 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70  nectionCount(*pp
164b0 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65  Btree)>0 );.  re
164c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
164d0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
164e0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
164f0 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
16500 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
16510 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
16520 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
16530 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
16540 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
16550 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
16560 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
16570 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
16580 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
16590 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
165a0 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
165b0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
165c0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
165d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
165e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
165f0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16600 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
16610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
16620 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
16630 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
16640 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
16650 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
16660 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
16670 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16680 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
16690 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
166a0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
166b0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
166c0 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
166d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
166e0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
166f0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
16700 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
16710 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
16720 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
16730 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
16740 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
16750 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
16760 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
16770 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
16780 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
16790 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
167a0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
167b0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
167c0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
167d0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
167e0 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
167f0 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
16800 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
16810 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
16820 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
16830 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
16840 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
16850 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
16860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16870 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
16880 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
16890 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
168a0 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
168b0 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
168c0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
168d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
168e0 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
168f0 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
16900 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
16910 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
16920 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
16930 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
16940 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
16950 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
16960 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
16970 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
16980 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
16990 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
169a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
169b0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
169c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
169d0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
169e0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
169f0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
16a00 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
16a10 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
16a20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
16a30 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
16a40 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
16a50 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
16a60 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
16a70 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
16a80 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
16a90 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
16aa0 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
16ab0 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
16ac0 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
16ad0 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
16ae0 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
16af0 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
16b00 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
16b10 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
16b20 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
16b30 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
16b40 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
16b50 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
16b60 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
16b70 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
16b80 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
16b90 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
16ba0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
16bb0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
16bc0 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
16bd0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
16be0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
16bf0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
16c00 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
16c10 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
16c20 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
16c30 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
16c40 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
16c50 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
16c60 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
16c70 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
16c80 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
16c90 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
16ca0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16cb0 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
16cc0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
16cd0 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
16ce0 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
16cf0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
16d00 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
16d10 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
16d20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
16d30 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
16d40 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
16d50 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
16d60 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
16d70 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
16d80 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
16d90 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
16da0 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
16db0 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
16dc0 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
16dd0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16de0 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
16df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
16e00 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
16e10 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
16e20 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
16e30 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
16e40 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
16e50 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
16e60 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
16e70 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
16e80 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
16e90 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
16ea0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16eb0 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
16ec0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
16ed0 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
16ee0 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
16ef0 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
16f00 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
16f10 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
16f20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16f30 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
16f40 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
16f50 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
16f60 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
16f70 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
16f80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16f90 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16fa0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16fb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16fc0 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
16fd0 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
16fe0 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
16ff0 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
17000 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
17010 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
17020 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
17030 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
17040 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
17050 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
17060 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
17070 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
17080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
17090 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
170a0 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
170b0 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
170c0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
170d0 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
170e0 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
170f0 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
17100 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
17110 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
17120 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
17130 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17140 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
17150 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
17160 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
17170 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
17180 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
17190 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
171a0 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
171b0 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
171c0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
171d0 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
171e0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
171f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17200 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
17210 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
17220 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
17230 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
17240 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
17250 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
17260 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
17270 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
17280 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
17290 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
172a0 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
172b0 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
172c0 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
172d0 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
172e0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
172f0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
17300 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
17310 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
17320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
17330 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
17340 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  ager, p->db);.  
17350 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
17360 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
17370 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
17380 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
17390 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
173a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
173b0 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
173c0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
173d0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
173e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
173f0 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
17400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17410 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
17420 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
17430 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
17440 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
17450 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
17460 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
17470 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
17480 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
17490 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
174a0 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
174b0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
174c0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
174d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
174e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
174f0 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
17500 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
17510 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
17520 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
17530 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
17540 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
17550 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
17560 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
17570 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
17580 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
17590 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
175a0 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
175b0 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
175c0 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
175d0 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
175e0 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
175f0 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
17600 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
17610 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
17620 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17630 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
17640 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
17650 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
17660 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
17670 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17680 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17690 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
176a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
176b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
176c0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
176d0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
176e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
176f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17700 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17710 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17720 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
17730 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
17740 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
17750 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
17760 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17770 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
17780 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
17790 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
177a0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
177b0 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
177c0 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
177d0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
177e0 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
177f0 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
17800 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
17810 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
17820 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
17830 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
17840 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
17850 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
17860 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
17870 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
17880 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
17890 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
178a0 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
178b0 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
178c0 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
178d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
178e0 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
178f0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17900 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
17910 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
17920 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
17930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17940 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17950 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17960 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
17970 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
17980 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
17990 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
179a0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
179b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
179c0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
179d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
179e0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
179f0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
17a00 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
17a10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17a20 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
17a30 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
17a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17a50 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
17a60 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
17a70 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
17a80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17a90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17aa0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17ab0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17ac0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17ad0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17ae0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
17af0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
17b00 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
17b10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17b20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17b30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17b40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
17b50 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
17b60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
17b70 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
17b80 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
17b90 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
17ba0 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
17bb0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
17bc0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
17bd0 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
17be0 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
17bf0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
17c00 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
17c10 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
17c20 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
17c30 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
17c40 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
17c50 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17c60 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
17c70 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
17c80 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
17c90 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
17ca0 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
17cb0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
17cc0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
17cd0 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
17ce0 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
17cf0 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
17d00 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
17d10 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
17d20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17d30 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
17d40 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
17d50 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
17d60 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
17d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17d80 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
17d90 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
17da0 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
17db0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
17dc0 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
17dd0 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
17de0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17df0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
17e00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17e10 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
17e20 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
17e30 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17e40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
17e50 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
17e60 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
17e70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17e80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
17e90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17ea0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
17eb0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
17ec0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
17ed0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
17ee0 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
17ef0 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
17f00 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
17f10 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
17f20 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
17f30 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
17f40 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
17f50 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
17f60 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
17f70 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
17f80 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
17f90 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
17fa0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
17fb0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
17fc0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
17fd0 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
17fe0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
17ff0 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
18000 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
18010 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
18020 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
18030 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
18040 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
18050 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
18060 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
18070 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
18080 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
18090 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
180a0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
180b0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
180c0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
180d0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
180e0 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
180f0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
18100 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
18110 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
18120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
18130 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
18140 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
18150 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
18160 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
18170 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
18180 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
18190 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
181a0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
181b0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
181c0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
181d0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
181e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
181f0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
18200 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
18210 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
18220 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
18230 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18240 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
18250 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18260 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
18270 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
18280 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
18290 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
182a0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
182b0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
182c0 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
182d0 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
182e0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
182f0 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
18300 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
18310 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18320 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
18330 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
18340 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18360 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
18370 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
18380 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
18390 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
183a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
183b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
183c0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
183d0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
183e0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
183f0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
18400 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
18410 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
18420 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
18430 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
18440 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
18450 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
18460 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
18470 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
18480 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
18490 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
184a0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
184b0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
184c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
184d0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
184e0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
184f0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
18500 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
18510 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
18520 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
18530 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
18540 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
18550 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
18560 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
18570 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18590 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
185a0 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
185b0 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
185c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
185d0 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
185e0 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
185f0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
18600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18610 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
18620 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
18630 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
18640 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
18650 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
18660 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
18670 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
18680 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
18690 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
186a0 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
186b0 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
186c0 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
186d0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
186e0 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
186f0 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
18700 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
18710 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
18720 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
18730 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
18740 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
18750 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
18760 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
18770 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
18780 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
18790 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
187a0 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
187b0 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
187c0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
187d0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
187e0 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
187f0 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
18800 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
18810 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
18820 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
18830 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
18840 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18850 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
18860 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18870 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
18880 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
18890 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
188a0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
188b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
188c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
188d0 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
188e0 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
188f0 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
18900 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
18910 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
18920 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
18930 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
18940 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
18950 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
18960 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
18970 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
18980 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
18990 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
189a0 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
189b0 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
189c0 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
189d0 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
189e0 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
189f0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18a00 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
18a10 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
18a20 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
18a30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18a40 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
18a50 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
18a60 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
18a70 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
18a80 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
18a90 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
18aa0 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
18ab0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
18ac0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18ad0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18ae0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
18af0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
18b00 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
18b10 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
18b20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
18b30 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
18b40 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
18b50 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
18b60 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
18b70 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
18b80 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
18b90 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
18ba0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
18bb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18bc0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
18bd0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
18be0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
18bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18c00 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
18c10 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
18c20 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
18c30 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
18c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18c50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18c60 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  n;.}../*.** Chan
18c70 67 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ge the values fo
18c80 72 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  r the BTS_SECURE
18c90 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f  _DELETE and BTS_
18ca0 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a  OVERWRITE flags:
18cb0 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  .**.**    newFla
18cc0 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20  g==0       Both 
18cd0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18ce0 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
18cf0 49 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a  ITE are cleared.
18d00 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31  **    newFlag==1
18d10 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52         BTS_SECUR
18d20 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64  E_DELETE set and
18d30 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
18d40 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  s cleared.**    
18d50 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20  newFlag==2      
18d60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18d70 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42  TE cleared and B
18d80 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
18d90 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  set.**    newFla
18da0 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68  g==(-1)    No ch
18db0 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73  anges.**.** This
18dc0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
18dd0 20 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46   a query if newF
18de0 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  lag is less than
18df0 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68   zero.**.** With
18e00 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73   BTS_OVERWRITE s
18e10 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  et, deleted cont
18e20 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74  ent is overwritt
18e30 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74  en by zeros, but
18e40 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61  .** freelist lea
18e50 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  f pages are not 
18e60 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
18e70 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
18e80 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64  hus in-page.** d
18e90 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18ea0 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66  s cleared, but f
18eb0 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20  reelist deleted 
18ec0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a  content is not..
18ed0 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53  **.** With BTS_S
18ee0 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70  ECURE_DELETE, op
18ef0 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20  eration is like 
18f00 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69  BTS_OVERWRITE wi
18f10 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a  th the addition.
18f20 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74  ** that freelist
18f30 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
18f40 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
18f50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
18f60 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68  increasing.** th
18f70 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b  e amount of disk
18f80 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   I/O..*/.int sql
18f90 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
18fa0 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
18fb0 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
18fc0 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
18fd0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18fe0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18ff0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
19000 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42  BTS_OVERWRITE==B
19010 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19020 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *2 );.  assert( 
19030 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d  BTS_FAST_SECURE=
19040 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c  =(BTS_OVERWRITE|
19050 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
19060 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  E) );.  if( newF
19070 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
19080 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
19090 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55  = ~BTS_FAST_SECU
190a0 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e  RE;.    p->pBt->
190b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
190c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65  SECURE_DELETE*ne
190d0 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d  wFlag;.  }.  b =
190e0 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
190f0 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
19100 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45  CURE)/BTS_SECURE
19110 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74  _DELETE;.  sqlit
19120 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19130 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
19140 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19150 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
19160 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
19170 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
19180 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
19190 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
191a0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
191b0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
191c0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
191d0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
191e0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
191f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
19200 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
19210 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
19220 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
19230 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
19240 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
19250 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19260 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
19270 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
19280 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
19290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
192a0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
192b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
192c0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
192d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
192e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
192f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
19300 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
19310 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
19320 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
19330 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
19340 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
19350 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
19360 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
19370 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
19380 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
19390 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
193a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
193b0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
193c0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
193d0 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
193e0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
193f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19400 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
19410 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19420 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
19430 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
19440 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
19450 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
19460 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
19470 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
19480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19490 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
194a0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
194b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
194c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
194d0 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
194e0 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
194f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
19500 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19510 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
19520 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
19530 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
19540 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
19550 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
19560 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
19570 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
19580 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
19590 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
195a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
195b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
195c0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
195d0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
195e0 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61  s not set the sa
195f0 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74  fety-level for t
19600 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
19610 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67  nection.** using
19620 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
19630 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68  nous", and if th
19640 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69  e safety-level i
19650 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
19660 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
19670 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
19680 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65   function as the
19690 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
196a0 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e  r,.** set it so.
196b0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .*/.#if SQLITE_D
196c0 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
196d0 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  US!=SQLITE_DEFAU
196e0 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
196f0 55 53 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66  US \.    && !def
19700 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
19710 5f 57 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69  _WAL).static voi
19720 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  d setDefaultSync
19730 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70  Flag(BtShared *p
19740 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65  Bt, u8 safety_le
19750 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  vel){.  sqlite3 
19760 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  *db;.  Db *pDb;.
19770 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64    if( (db=pBt->d
19780 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62  b)!=0 && (pDb=db
19790 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  ->aDb)!=0 ){.   
197a0 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
197b0 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
197c0 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
197d0 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44  ++; }.    if( pD
197e0 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a  b->bSyncSet==0 .
197f0 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66       && pDb->saf
19800 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74  ety_level!=safet
19810 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26  y_level .     &&
19820 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31   pDb!=&db->aDb[1
19830 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ] .    ){.      
19840 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
19850 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  l = safety_level
19860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
19870 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
19880 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
19890 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
198a0 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
198b0 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
198c0 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20  _MASK));.    }. 
198d0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
198e0 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79  ine setDefaultSy
198f0 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74  ncFlag(pBt,safet
19900 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a  y_level).#endif.
19910 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
19920 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
19930 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
19940 65 28 42 74 53 68 61 72 65 64 2a 29 3b 0a 0a 0a  e(BtShared*);...
19950 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
19960 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
19970 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19980 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
19990 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
199a0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
199b0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
199c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
199d0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
199e0 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
199f0 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
19a00 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
19a10 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
19a20 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
19a30 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
19a40 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
19a50 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
19a60 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
19a70 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
19a80 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
19a90 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
19aa0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
19ab0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
19ac0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
19ad0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19ae0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
19af0 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
19b00 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
19b10 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
19b20 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
19b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
19b40 20 20 75 33 32 20 6e 50 61 67 65 3b 20 20 20 20    u32 nPage;    
19b50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19b60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
19b70 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
19b80 33 32 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  32 nPageFile = 0
19b90 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
19ba0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19bb0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
19bc0 20 75 33 32 20 6e 50 61 67 65 48 65 61 64 65 72   u32 nPageHeader
19bd0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
19be0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
19bf0 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
19c00 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
19c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19c20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
19c30 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19c40 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
19c50 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
19c60 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
19c70 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
19c80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19c90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19ca0 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
19cb0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
19cc0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
19cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19ce0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
19cf0 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
19d00 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
19d10 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
19d20 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
19d30 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
19d40 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
19d50 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
19d60 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
19d70 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
19d80 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
19d90 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19da0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
19db0 28 69 6e 74 2a 29 26 6e 50 61 67 65 46 69 6c 65  (int*)&nPageFile
19dc0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
19dd0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
19de0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
19df0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
19e00 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
19e10 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
19e20 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
19e30 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
19e40 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65  gs & SQLITE_Rese
19e50 74 44 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b  tDatabase)!=0 ){
19e60 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 30 3b 0a  .    nPage = 0;.
19e70 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
19e80 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
19e90 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
19ea0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
19eb0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
19ec0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
19ed0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19ee0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19ef0 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
19f00 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
19f10 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
19f20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
19f30 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
19f40 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
19f50 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
19f60 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
19f70 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
19f80 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
19f90 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
19fa0 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
19fb0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
19fc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19fd0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19fe0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
19ff0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1a000 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
1a010 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
1a020 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a030 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
1a040 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1a050 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
1a060 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a070 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
1a080 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
1a090 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
1a0a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1a0b0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
1a0c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
1a0d0 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
1a0e0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a0f0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1a100 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
1a110 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
1a120 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
1a130 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
1a140 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
1a150 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
1a160 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
1a170 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
1a180 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
1a190 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
1a1a0 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
1a1b0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
1a1c0 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
1a1d0 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
1a1e0 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
1a1f0 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
1a200 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
1a210 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
1a220 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
1a230 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
1a240 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
1a250 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
1a260 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
1a270 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
1a280 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
1a290 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
1a2a0 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
1a2b0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
1a2c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
1a2d0 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
1a2e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1a2f0 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
1a300 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
1a310 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1a320 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1a330 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
1a340 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
1a350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a360 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1a370 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a380 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
1a390 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44  se{.        setD
1a3a0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
1a3b0 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
1a3c0 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
1a3d0 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  US+1);.        i
1a3e0 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
1a3f0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1a400 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1a410 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1a420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a450 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
1a460 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
1a470 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
1a480 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
1a490 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
1a4a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1a4b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a4c0 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
1a4d0 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
1a4e0 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
1a4f0 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
1a500 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
1a510 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
1a520 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
1a530 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
1a540 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
1a550 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
1a560 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
1a570 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
1a580 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
1a590 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
1a5a0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
1a5b0 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
1a5c0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
1a5d0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
1a5e0 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
1a5f0 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
1a600 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a610 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a620 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
1a630 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
1a640 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
1a650 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
1a660 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
1a670 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
1a680 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
1a690 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
1a6a0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
1a6b0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
1a6c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1a6d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a6e0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
1a6f0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
1a700 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
1a710 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
1a720 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a730 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
1a740 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
1a750 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
1a760 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
1a770 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
1a780 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
1a790 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
1a7a0 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
1a7b0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
1a7c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
1a7d0 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
1a7e0 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
1a7f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1a800 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1a810 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1a820 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a830 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
1a840 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
1a850 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
1a860 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1a870 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
1a880 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
1a890 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
1a8a0 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
1a8b0 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
1a8c0 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
1a8d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a8e0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
1a8f0 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
1a900 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
1a910 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
1a920 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
1a930 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1a940 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
1a950 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
1a960 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
1a970 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
1a980 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
1a990 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
1a9a0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
1a9b0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
1a9c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1a9d0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
1a9e0 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
1a9f0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
1aa00 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
1aa10 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
1aa20 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
1aa30 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
1aa40 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
1aa50 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1aa60 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
1aa70 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
1aa80 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
1aa90 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
1aaa0 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
1aab0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1aac0 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
1aad0 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
1aae0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1aaf0 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
1ab00 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
1ab10 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
1ab20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
1ab30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
1ab40 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1ab50 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
1ab60 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1ab70 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
1ab80 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
1ab90 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1aba0 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
1abb0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1abc0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
1abd0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1abe0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
1abf0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1ac00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1ac10 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1ac20 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1ac30 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1ac40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
1ac70 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
1ac80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ac90 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
1aca0 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28  3WritableSchema(
1acb0 70 42 74 2d 3e 64 62 29 3d 3d 30 20 26 26 20 6e  pBt->db)==0 && n
1acc0 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29  Page>nPageFile )
1acd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ace0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1acf0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
1ad00 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1ad10 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
1ad20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31  DENCE-OF: R-2831
1ad30 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c  2-64704 However,
1ad40 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65   the usable size
1ad50 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
1ad60 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73  to.    ** be les
1ad70 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f  s than 480. In o
1ad80 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
1ad90 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
1ada0 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  512, then the.  
1adb0 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70    ** reserved sp
1adc0 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20  ace size cannot 
1add0 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20  exceed 32. */.  
1ade0 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
1adf0 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
1ae00 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1ae10 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1ae20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
1ae30 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
1ae40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
1ae50 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
1ae60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ae70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
1ae80 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
1ae90 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
1aea0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
1aeb0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
1aec0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
1aed0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
1aee0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
1aef0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
1af00 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
1af10 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
1af20 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
1af30 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
1af40 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
1af50 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
1af60 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
1af70 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
1af80 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
1af90 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
1afa0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
1afb0 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
1afc0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
1afd0 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
1afe0 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
1aff0 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
1b000 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
1b010 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
1b020 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
1b030 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
1b040 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
1b050 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
1b060 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
1b070 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1b080 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
1b090 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
1b0a0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
1b0b0 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
1b0c0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
1b0d0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
1b0e0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
1b0f0 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
1b100 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
1b110 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
1b120 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
1b130 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
1b140 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
1b150 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
1b160 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1b170 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
1b180 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
1b190 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1b1a0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
1b1b0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
1b1c0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
1b1d0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
1b1e0 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
1b1f0 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
1b200 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1b210 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
1b220 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
1b230 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
1b240 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1b250 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
1b260 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
1b270 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
1b280 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
1b290 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
1b2a0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
1b2b0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
1b2c0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
1b2d0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
1b2e0 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
1b2f0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1b300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1b310 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1b320 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
1b330 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  One(pPage1);.  p
1b340 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
1b350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b360 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
1b370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b380 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
1b390 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
1b3a0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1b3b0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1b3c0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1b3d0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1b3e0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1b3f0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1b400 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
1b410 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
1b420 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
1b430 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
1b440 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
1b450 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
1b460 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
1b470 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
1b480 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
1b490 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
1b4a0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
1b4b0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
1b4c0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1b4d0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1b4e0 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
1b4f0 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
1b500 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
1b510 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
1b520 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
1b530 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1b540 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
1b550 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
1b560 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
1b570 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1b580 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1b590 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1b5a0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1b5b0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1b5c0 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
1b5d0 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
1b5e0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
1b5f0 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
1b600 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
1b610 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
1b620 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
1b630 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
1b640 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
1b650 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
1b660 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
1b670 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
1b680 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
1b690 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
1b6a0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
1b6b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1b6c0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
1b6d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
1b6e0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
1b6f0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1b700 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
1b710 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
1b720 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
1b730 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
1b740 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
1b750 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1b760 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
1b770 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1b780 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1b790 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
1b7a0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
1b7b0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
1b7c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b7d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1b7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
1b7f0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
1b800 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
1b810 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
1b820 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
1b830 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1b840 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1b850 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
1b860 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
1b870 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1b880 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
1b890 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
1b8a0 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
1b8b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
1b8c0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
1b8d0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
1b8e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1b8f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1b900 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  e(pPage1);.  }.}
1b910 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
1b920 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
1b930 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
1b940 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
1b950 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
1b960 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
1b970 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
1b980 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1b990 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
1b9a0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1b9b0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
1b9c0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1b9d0 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
1b9e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
1b9f0 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
1ba00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ba10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1ba20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
1ba30 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
1ba40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ba50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
1ba60 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1ba70 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
1ba80 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
1ba90 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
1baa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1bab0 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
1bac0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1bad0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
1bae0 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
1baf0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
1bb00 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
1bb10 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
1bb20 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
1bb30 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
1bb40 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
1bb50 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
1bb60 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
1bb70 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1bb80 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
1bb90 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
1bba0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
1bbb0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
1bbc0 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
1bbd0 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
1bbe0 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
1bbf0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
1bc00 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
1bc10 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
1bc20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
1bc30 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
1bc40 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
1bc50 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
1bc60 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
1bc70 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
1bc80 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
1bc90 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
1bca0 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
1bcb0 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
1bcc0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
1bcd0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
1bce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bcf0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
1bd00 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1bd10 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1bd20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
1bd30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1bd40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
1bd50 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
1bd60 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
1bd70 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
1bd80 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
1bd90 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
1bda0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
1bdb0 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
1bdc0 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
1bdd0 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
1bde0 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
1bdf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1be00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1be10 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
1be20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1be30 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
1be40 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
1be50 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
1be60 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
1be70 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
1be80 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
1be90 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
1bea0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1beb0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1bec0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
1bed0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1bee0 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
1bef0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1bf00 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bf10 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
1bf20 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
1bf30 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
1bf40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1bf50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1bf60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bf70 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
1bf80 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
1bf90 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
1bfa0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
1bfb0 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
1bfc0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1bfd0 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
1bfe0 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
1bff0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1c000 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1c010 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
1c020 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
1c030 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
1c040 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
1c050 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
1c060 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
1c070 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
1c080 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
1c090 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
1c0a0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
1c0b0 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
1c0c0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
1c0d0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1c0e0 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
1c0f0 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
1c100 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
1c110 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
1c120 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
1c130 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1c140 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1c150 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1c160 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
1c170 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
1c180 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
1c190 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1c1a0 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
1c1b0 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
1c1c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1c1d0 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
1c1e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
1c1f0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
1c200 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1c210 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
1c220 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
1c230 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1c240 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
1c250 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
1c260 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
1c270 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
1c280 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
1c290 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
1c2a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1c2b0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
1c2c0 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
1c2d0 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
1c2e0 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
1c2f0 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
1c300 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
1c310 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
1c320 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
1c330 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
1c340 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
1c350 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
1c360 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
1c370 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
1c380 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1c390 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
1c3a0 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
1c3b0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
1c3c0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
1c3d0 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
1c3e0 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
1c3f0 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
1c400 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
1c410 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
1c420 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
1c430 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
1c440 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
1c450 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
1c460 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
1c470 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
1c480 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
1c490 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
1c4a0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
1c4b0 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
1c4c0 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
1c4d0 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
1c4e0 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
1c4f0 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
1c500 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
1c510 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
1c520 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
1c530 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
1c540 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
1c550 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1c560 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1c570 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1c580 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1c590 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1c5a0 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1c5b0 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1c5c0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1c5d0 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1c5e0 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1c5f0 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1c600 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c610 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1c620 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1c630 61 67 2c 20 69 6e 74 20 2a 70 53 63 68 65 6d 61  ag, int *pSchema
1c640 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42 74 53 68  Version){.  BtSh
1c650 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1c660 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
1c670 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
1c680 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1c690 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1c6a0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1c6b0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1c6c0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1c6d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1c6e0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1c6f0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1c700 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1c710 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1c720 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1c730 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1c740 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1c750 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1c760 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1c770 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1c780 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1c790 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1c7a0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1c7b0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1c7c0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1c7d0 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1c7e0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1c7f0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1c800 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  if( (p->db->flag
1c810 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74  s & SQLITE_Reset
1c820 44 61 74 61 62 61 73 65 29 20 0a 20 20 20 26 26  Database) .   &&
1c830 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
1c840 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
1c850 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ger)==0 .  ){.  
1c860 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1c870 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  &= ~BTS_READ_ONL
1c880 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  Y;.  }..  /* Wri
1c890 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1c8a0 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1c8b0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1c8c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1c8d0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1c8e0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1c8f0 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1c900 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1c910 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1c920 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1c930 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1c940 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1c950 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1c960 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1c970 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1c980 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1c990 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1c9a0 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1c9b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1c9c0 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1c9d0 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1c9e0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1c9f0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1ca00 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1ca10 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1ca20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1ca30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1ca40 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1ca50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ca60 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1ca70 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1ca80 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1ca90 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1caa0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1cab0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1cac0 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1cad0 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1cae0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1caf0 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1cb00 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1cb10 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1cb20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1cb30 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1cb40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1cb50 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1cb60 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1cb70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1cb80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1cb90 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1cba0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cbb0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1cbc0 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1cbd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1cbe0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1cbf0 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1cc00 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1cc10 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1cc20 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1cc30 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1cc40 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1cc50 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1cc60 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1cc70 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1cc80 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1cc90 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1cca0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1ccb0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1ccc0 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1ccd0 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1cce0 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1ccf0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1cd00 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1cd10 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1cd20 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1cd30 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1cd40 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1cd50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1cd60 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1cd70 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1cd80 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1cd90 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1cda0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1cdb0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1cdc0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1cdd0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1cde0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1cdf0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1ce00 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1ce10 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1ce20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1ce30 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1ce40 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1ce50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1ce60 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1ce70 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1ce80 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1ce90 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1cea0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1ceb0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1cec0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1ced0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1cee0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1cef0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1cf00 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1cf10 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1cf20 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1cf30 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1cf40 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1cf50 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1cf60 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1cf70 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1cf80 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1cf90 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1cfa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1cfb0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1cfc0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1cfd0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1cfe0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1cff0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1d000 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1d010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1d020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1d030 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1d040 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1d050 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1d060 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1d070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1d090 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1d0a0 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Bt);.        }el
1d0b0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1d0c0 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20  E_BUSY_SNAPSHOT 
1d0d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1d0e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1d0f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  E ){.          /
1d100 2a 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e  * if there was n
1d110 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  o transaction op
1d120 65 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  ened when this f
1d130 75 6e 63 74 69 6f 6e 20 77 61 73 0a 20 20 20 20  unction was.    
1d140 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20        ** called 
1d150 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  and SQLITE_BUSY_
1d160 53 4e 41 50 53 48 4f 54 20 69 73 20 72 65 74 75  SNAPSHOT is retu
1d170 72 6e 65 64 2c 20 63 68 61 6e 67 65 20 74 68 65  rned, change the
1d180 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1d190 20 2a 2a 20 63 6f 64 65 20 74 6f 20 53 51 4c 49   ** code to SQLI
1d1a0 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 20 20  TE_BUSY. */.    
1d1b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d1c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1d1d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d1e0 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
1d1f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d200 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1d210 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1d220 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
1d230 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
1d240 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
1d250 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d260 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
1d270 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
1d280 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
1d290 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  .  sqlite3PagerR
1d2a0 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74 28  esetLockTimeout(
1d2b0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20  pBt->pPager);.. 
1d2c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d2d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1d2e0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d2f0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1d300 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1d310 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1d320 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1d330 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1d340 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1d350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1d360 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1d370 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1d380 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1d390 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1d3a0 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1d3b0 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1d3c0 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1d3d0 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1d3e0 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1d3f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1d400 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1d410 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1d420 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1d430 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1d440 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1d450 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1d460 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1d470 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1d480 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1d490 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1d4a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1d4b0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1d4c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d4d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1d4e0 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1d4f0 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1d500 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1d510 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1d520 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1d530 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1d540 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1d550 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1d560 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1d570 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1d580 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1d590 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1d5a0 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1d5b0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1d5c0 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1d5d0 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1d5e0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1d5f0 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1d600 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1d610 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1d620 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1d630 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1d640 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1d650 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1d660 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1d670 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1d680 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1d690 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1d6a0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1d6b0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1d6c0 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1d6d0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1d6e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1d6f0 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1d700 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d710 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1d720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d730 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1d740 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1d750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d770 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1d780 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1d790 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1d7a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d7b0 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73 5f 62 65   }.  }..trans_be
1d7c0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1d7d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d7e0 69 66 28 20 70 53 63 68 65 6d 61 56 65 72 73 69  if( pSchemaVersi
1d7f0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 63  on ){.      *pSc
1d800 68 65 6d 61 56 65 72 73 69 6f 6e 20 3d 20 67 65  hemaVersion = ge
1d810 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1d820 67 65 31 2d 3e 61 44 61 74 61 5b 34 30 5d 29 3b  ge1->aData[40]);
1d830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1d840 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 2f  rflag ){.      /
1d850 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
1d860 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
1d870 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
1d880 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
1d890 20 20 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61        ** open sa
1d8a0 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
1d8b0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1d8c0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1d8d0 6e 20 30 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  n 0 and.      **
1d8e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1d8f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d900 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1d910 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1d920 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1d930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d940 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1d950 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1d960 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1d970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  ;.    }.  }..  b
1d980 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1d990 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1d9a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1d9b0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1d9c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d9d0 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
1d9e0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
1d9f0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1da00 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1da10 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
1da20 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
1da30 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
1da40 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1da50 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
1da60 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
1da70 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
1da80 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1da90 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
1daa0 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
1dab0 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
1dac0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
1dad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1daf0 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
1db00 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
1db10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1db30 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1db40 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
1db50 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1db80 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
1db90 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1dba0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
1dbb0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
1dbc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1dbd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1dbe0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1dbf0 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e  ;.  rc = pPage->
1dc00 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f  isInit ? SQLITE_
1dc10 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61  OK : btreeInitPa
1dc20 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1dc30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43   return rc;.  nC
1dc50 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1dc60 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
1dc70 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1dc80 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1dc90 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1dca0 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
1dcb0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
1dcc0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
1dcd0 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
1dce0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1dcf0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1dd00 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
1dd10 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
1dd20 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1dd30 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1dd40 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1dd50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1dd60 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dd70 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1dd80 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1dd90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1dda0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1ddb0 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
1ddc0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1ddd0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1dde0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20  no, &rc);.  }.. 
1ddf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1de00 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
1de10 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
1de20 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
1de30 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
1de40 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
1de50 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1de60 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
1de70 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
1de80 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
1de90 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
1dea0 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
1deb0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
1dec0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
1ded0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1dee0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1def0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
1df00 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1df10 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
1df20 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1df30 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
1df40 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1df50 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1df60 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
1df70 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
1df80 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1df90 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
1dfa0 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
1dfb0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
1dfc0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1dfd0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
1dfe0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
1dff0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1e000 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
1e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e020 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1e030 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
1e040 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
1e050 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
1e060 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
1e070 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
1e080 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
1e090 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e0a0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1e0b0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1e0c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e0d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1e0e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1e0f0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
1e100 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1e110 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
1e120 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
1e130 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
1e140 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
1e150 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1e160 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
1e170 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1e180 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1e190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e1a0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
1e1b0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ge);.    }.    p
1e1c0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1e1d0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1e1e0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
1e1f0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
1e200 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
1e210 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1e220 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1e230 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1e240 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e250 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e260 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
1e270 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
1e280 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1e290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
1e2a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1e2b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
1e2c0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e2d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
1e2e0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
1e2f0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
1e300 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
1e310 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
1e320 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
1e330 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
1e340 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
1e350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1e360 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cell+info.nSize 
1e370 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
1e380 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
1e390 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
1e3a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e3b0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1e3c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1e3d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1e3e0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
1e3f0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1e400 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ze-4) ){.       
1e410 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1e420 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1e430 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1e440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e460 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e470 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1e480 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1e490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1e4a0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1e4b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1e4c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1e4d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1e4e0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1e4f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1e500 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1e510 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1e520 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1e530 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1e540 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1e550 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1e560 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e570 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1e580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1e590 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1e5a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1e5b0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
1e5c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e5d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e5e0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
1e5f0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1e600 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
1e610 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
1e620 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
1e630 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
1e640 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
1e650 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
1e660 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
1e670 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
1e680 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
1e690 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
1e6a0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
1e6b0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
1e6c0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
1e6d0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1e6e0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
1e6f0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1e700 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
1e710 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
1e720 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
1e730 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
1e740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e750 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
1e760 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1e770 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1e780 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
1e790 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
1e7a0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
1e7b0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
1e7c0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1e7d0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1e7e0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
1e7f0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1e800 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
1e810 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1e820 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
1e830 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1e840 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
1e850 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
1e860 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
1e870 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
1e880 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
1e890 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
1e8a0 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
1e8b0 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
1e8c0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1e8d0 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
1e8e0 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
1e8f0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
1e900 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
1e910 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
1e920 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
1e930 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
1e940 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1e950 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1e960 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1e970 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
1e980 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
1e990 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1e9a0 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
1e9b0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
1e9c0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1e9d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e9e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1e9f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ea00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1ea10 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
1ea20 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  e->pBt==pBt );. 
1ea30 20 69 66 28 20 69 44 62 50 61 67 65 3c 33 20 29   if( iDbPage<3 )
1ea40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1ea50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
1ea60 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1ea70 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1ea80 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1ea90 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1eaa0 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1eab0 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1eac0 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1ead0 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1eae0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1eaf0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1eb00 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1eb10 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1eb20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1eb30 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1eb40 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1eb50 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1eb60 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1eb70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1eb80 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1eb90 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1eba0 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1ebb0 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1ebc0 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1ebd0 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1ebe0 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1ebf0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1ec00 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1ec10 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1ec20 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1ec30 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1ec40 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1ec50 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1ec60 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1ec70 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1ec80 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1ec90 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1eca0 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1ecb0 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1ecc0 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1ecd0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1ece0 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1ecf0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1ed00 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1ed10 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1ed20 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1ed30 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1ed40 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1ed50 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1ed60 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1ed70 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1ed80 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1ed90 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1eda0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1edb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1edc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1edd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1ede0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1edf0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1ee00 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1ee10 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1ee20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1ee30 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1ee40 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1ee50 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1ee60 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1ee70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ee80 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ee90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1eea0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1eeb0 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1eec0 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1eed0 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1eee0 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1eef0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1ef00 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1ef10 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1ef20 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1ef30 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1ef40 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1ef50 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1ef60 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1ef70 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1ef80 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1ef90 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1efa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1efb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1efc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1efd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1efe0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1eff0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1f000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1f020 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1f030 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1f040 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f050 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1f060 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1f070 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1f080 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1f090 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1f0a0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1f0b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f0c0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1f0d0 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1f0e0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1f0f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1f100 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f110 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1f120 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1f130 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1f140 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1f150 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1f160 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1f170 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1f180 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1f190 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1f1a0 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1f1b0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1f1c0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1f1d0 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1f1e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1f1f0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1f200 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1f210 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1f220 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1f230 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1f240 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1f250 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1f260 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1f270 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1f280 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1f290 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1f2a0 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1f2b0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1f2c0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1f2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1f2e0 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1f2f0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1f300 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1f310 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1f320 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1f330 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1f340 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f350 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1f360 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1f370 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1f380 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1f390 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1f3a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1f3b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1f3c0 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1f3d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1f3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1f3f0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1f400 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1f410 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1f420 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1f430 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1f440 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1f450 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1f460 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1f470 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1f480 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1f490 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1f4a0 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1f4b0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1f4c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1f4d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1f4e0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1f4f0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1f500 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1f510 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1f520 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1f530 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1f540 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1f550 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1f560 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1f570 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f580 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1f590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1f5a0 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1f5b0 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1f5c0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1f5d0 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1f5e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f5f0 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1f600 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1f610 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1f620 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1f630 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1f640 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1f650 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1f660 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f670 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1f680 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1f690 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1f6a0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1f6b0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1f6c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f6d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f6e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1f6f0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1f700 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1f710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f720 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f730 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1f740 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1f750 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1f760 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1f770 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1f780 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1f790 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1f7a0 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1f7b0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1f7c0 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1f7d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1f7e0 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1f7f0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1f800 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1f810 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1f820 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1f830 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1f840 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1f850 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1f860 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1f870 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1f880 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1f890 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1f8a0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1f8b0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1f8c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1f8d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1f8e0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1f8f0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1f900 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1f910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f920 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f930 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f940 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1f950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1f960 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1f970 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1f980 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1f990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1f9a0 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1f9b0 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1f9c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1f9d0 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1f9e0 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1f9f0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1fa00 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1fa10 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1fa20 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1fa30 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1fa40 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1fa50 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1fa60 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1fa70 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1fa80 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1fa90 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1faa0 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1fab0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1fac0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1fad0 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1fae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1faf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1fb00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1fb10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1fb20 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1fb30 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1fb40 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1fb50 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1fb60 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1fb70 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1fb80 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1fb90 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1fba0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1fbb0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1fbc0 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1fbd0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1fbe0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1fbf0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1fc00 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1fc10 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1fc20 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1fc30 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1fc40 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1fc50 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1fc60 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1fc70 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1fc80 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1fc90 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1fca0 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1fcb0 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1fcc0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1fcd0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1fce0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1fcf0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1fd00 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1fd10 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1fd20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1fd30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fd40 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1fd50 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1fd60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fd70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fd80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1fd90 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1fda0 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1fdb0 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1fdc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fdd0 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1fde0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1fdf0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1fe00 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1fe10 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1fe20 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1fe30 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1fe40 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1fe50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fe60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fe70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fe80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fe90 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1fea0 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1feb0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1fec0 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1fed0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1fee0 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1fef0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1ff00 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1ff10 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1ff20 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1ff30 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1ff40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ff50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ff60 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1ff70 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1ff80 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1ff90 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1ffa0 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1ffb0 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1ffc0 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1ffd0 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1ffe0 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1fff0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
20000 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
20010 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
20020 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
20030 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
20040 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
20050 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
20060 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
20070 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
20080 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
20090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
200a0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
200b0 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
200c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
200d0 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
200e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
200f0 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
20100 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
20110 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
20140 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
20150 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
20160 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
20170 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
20180 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
20190 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
201a0 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
201b0 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
201c0 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
201d0 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
201e0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
201f0 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
20200 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
20210 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
20220 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
20230 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
20240 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
20250 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
20260 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
20270 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
20280 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
20290 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
202a0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
202b0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
202c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
202d0 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
202e0 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
202f0 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
20300 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
20310 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
20320 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
20330 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
20340 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
20350 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
20360 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
20370 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
20380 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
20390 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
203a0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
203b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
203c0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
203d0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
203e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
203f0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
20400 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
20410 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
20420 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
20430 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20440 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
20450 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20460 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
20470 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
20480 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
20490 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
204a0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
204b0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
204c0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
204d0 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
204e0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
204f0 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
20500 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
20510 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
20520 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
20530 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
20540 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
20550 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
20560 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
20570 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
20580 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
20590 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
205a0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
205b0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
205c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
205d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
205e0 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
205f0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
20600 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
20610 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
20620 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
20630 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
20640 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
20650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20660 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20670 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
20680 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
20690 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
206a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
206b0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
206c0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
206d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
206e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
206f0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
20700 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
20710 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
20720 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20730 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
20740 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
20750 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20760 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
20770 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
20780 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
20790 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
207a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
207b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
207c0 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
207d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
207e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
207f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20800 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
20810 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
20820 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
20830 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
20840 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
20850 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
20860 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
20870 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
20880 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
20890 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
208a0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
208b0 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
208c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
208d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
208e0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
208f0 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
20900 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
20910 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
20920 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
20930 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20940 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
20950 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
20960 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
20970 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
20980 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
20990 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
209a0 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
209b0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
209c0 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
209d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
209e0 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
209f0 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
20a00 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
20a10 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
20a20 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
20a30 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
20a40 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
20a50 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
20a60 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
20a70 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
20a80 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
20a90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
20aa0 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
20ab0 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
20ac0 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
20ad0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
20ae0 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
20af0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
20b00 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
20b10 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20b20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
20b30 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
20b40 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
20b50 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
20b60 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
20b70 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
20b80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
20b90 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
20ba0 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
20bb0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
20bc0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
20bd0 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
20be0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
20bf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20c00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20c10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
20c20 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
20c30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20c40 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
20c50 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
20c60 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
20c70 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
20c80 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
20c90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20ca0 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
20cb0 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
20cc0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
20cd0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
20ce0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
20cf0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
20d00 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
20d10 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
20d20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
20d30 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
20d40 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
20d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20d60 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
20d70 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
20d80 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
20d90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20da0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
20db0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
20dc0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
20dd0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20de0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
20df0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
20e00 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
20e10 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
20e20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20e30 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20e40 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
20e50 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
20e60 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
20e70 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
20e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20e90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20eb0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
20ec0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
20ed0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
20ee0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
20ef0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
20f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
20f10 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
20f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20f30 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
20f40 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
20f50 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
20f60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
20f70 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
20f80 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
20f90 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
20fa0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
20fb0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
20fc0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20fd0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
20fe0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
20ff0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
21000 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
21010 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
21020 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
21030 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
21040 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
21050 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
21060 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
21070 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
21080 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
21090 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
210a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
210b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
210c0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
210d0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
210e0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
210f0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
21100 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
21110 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
21120 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
21130 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
21140 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
21150 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
21160 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
21170 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
21180 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
21190 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
211a0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
211b0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
211c0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
211d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
211e0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
211f0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
21200 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21210 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
21220 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
21230 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
21240 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
21250 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
21260 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
21270 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
21280 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
21290 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
212a0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
212b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
212c0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
212d0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
212e0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
212f0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
21300 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
21310 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
21320 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
21330 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
21340 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
21350 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
21360 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21370 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
21380 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
21390 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
213a0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
213b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
213c0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
213d0 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
213e0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
213f0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
21400 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
21410 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
21420 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
21430 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
21440 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
21450 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
21460 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
21470 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
21480 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
21490 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
214a0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
214b0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
214c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
214d0 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
214e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
214f0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
21500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21510 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
21520 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
21530 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
21540 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
21550 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21560 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
21570 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21580 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
21590 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
215a0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
215b0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
215c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
215d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
215e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
215f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
21600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
21620 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
21630 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
21640 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
21650 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
21660 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
21670 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21690 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
216a0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
216b0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
216c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
216d0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
216e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
216f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21700 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
21710 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
21720 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
21730 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
21740 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
21750 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
21760 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
21770 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
21780 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
21790 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
217a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
217b0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
217c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
217d0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
217e0 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
217f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
21800 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
21810 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
21820 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
21830 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
21840 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
21850 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
21860 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
21870 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
21880 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
21890 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
218a0 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
218b0 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
218c0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
218d0 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
218e0 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
218f0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
21900 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
21910 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
21920 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
21930 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
21940 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
21950 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
21960 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
21970 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
21980 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
21990 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
219a0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
219b0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
219c0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
219d0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
219e0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
219f0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
21a00 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
21a10 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
21a20 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
21a30 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
21a40 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
21a50 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
21a60 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
21a70 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
21a80 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
21a90 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
21aa0 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
21ab0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
21ac0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
21ad0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
21ae0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
21af0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
21b00 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
21b10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
21b20 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
21b30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
21b40 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
21b50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
21b60 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
21b70 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
21b80 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
21b90 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
21ba0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
21bb0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
21bc0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
21bd0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
21be0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
21bf0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
21c00 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
21c10 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
21c20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
21c30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
21c40 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
21c50 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
21c60 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
21c70 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
21c80 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
21c90 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
21ca0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
21cb0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
21cc0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
21cd0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
21ce0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
21cf0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
21d00 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
21d10 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
21d20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21d30 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
21d40 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
21d50 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
21d60 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
21d70 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
21d80 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
21d90 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
21da0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
21db0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
21dc0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
21dd0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
21de0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
21df0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
21e00 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
21e10 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
21e20 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
21e30 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
21e40 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
21e50 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
21e60 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
21e70 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
21e80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
21e90 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
21ea0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
21eb0 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
21ec0 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
21ed0 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
21ee0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21ef0 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
21f00 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
21f10 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
21f20 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
21f30 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
21f40 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
21f50 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
21f60 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
21f70 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
21f80 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
21f90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
21fa0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
21fb0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
21fc0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
21fd0 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
21fe0 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
21ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
22000 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
22010 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
22020 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
22030 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
22040 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
22050 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
22060 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
22070 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
22080 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
22090 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
220a0 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
220b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
220c0 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
220d0 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
220e0 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
220f0 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
22100 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
22110 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
22120 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
22130 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
22140 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
22150 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
22160 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
22170 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
22180 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
22190 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
221a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
221b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
221c0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
221d0 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
221e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
221f0 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
22200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
22210 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22220 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
22230 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
22240 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
22250 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
22260 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
22270 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
22280 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
22290 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
222a0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
222b0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
222c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
222d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
222e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
222f0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
22300 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
22310 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
22320 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
22330 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
22340 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
22350 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
22360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22370 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
22380 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
22390 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
223a0 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
223b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
223c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
223d0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
223e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
223f0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
22400 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
22410 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
22420 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
22430 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
22440 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
22450 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
22460 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
22470 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
22480 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
22490 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
224a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
224b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
224c0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
224d0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
224e0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
224f0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
22500 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
22510 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
22520 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
22530 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
22540 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
22550 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
22560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
22570 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22580 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
22590 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
225a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
225b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
225c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
225d0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
225e0 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
225f0 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
22600 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
22610 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
22620 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
22630 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
22640 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
22650 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
22660 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
22670 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
22680 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
22690 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
226a0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
226b0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
226c0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
226d0 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
226e0 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
226f0 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
22700 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
22710 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
22720 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
22730 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
22740 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
22750 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
22760 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22770 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
22780 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
22790 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
227a0 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
227b0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
227c0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
227d0 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
227e0 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
227f0 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
22800 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
22810 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
22820 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
22830 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
22840 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
22850 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
22860 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
22870 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
22880 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
22890 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
228a0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
228b0 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
228c0 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
228d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
228e0 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
228f0 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
22900 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
22910 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
22920 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
22930 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
22940 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
22950 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
22960 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
22970 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
22980 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
22990 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
229a0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
229b0 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
229c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
229d0 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
229e0 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
229f0 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
22a00 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
22a10 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
22a20 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
22a30 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22a40 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
22a50 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
22a60 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
22a70 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
22a80 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
22a90 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
22aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22ab0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
22ac0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
22ad0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
22ae0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22af0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
22b00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22b10 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
22b20 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
22b30 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
22b40 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
22b50 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
22b60 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
22b70 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
22b80 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
22b90 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
22ba0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
22bb0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72  t){.      if( wr
22bc0 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63  iteOnly && (p->c
22bd0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
22be0 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a  riteFlag)==0 ){.
22bf0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
22c00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22c10 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
22c20 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
22c30 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
22c40 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
22c50 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
22c60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22c70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22c80 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
22c90 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
22ca0 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72  ursors(pBtree, r
22cb0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
22cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22cf0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
22d00 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
22d10 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
22d20 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
22d30 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b  T;.        p->sk
22d40 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
22d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22d60 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
22d70 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
22d80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22d90 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
22da0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
22db0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
22dc0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
22dd0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
22de0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
22df0 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
22e00 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
22e10 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
22e20 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
22e30 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
22e40 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
22e50 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
22e60 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
22e70 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
22e80 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
22e90 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
22ea0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
22eb0 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
22ec0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
22ed0 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
22ee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
22ef0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
22f00 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
22f10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
22f20 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
22f30 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
22f40 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
22f50 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
22f60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22f70 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
22f80 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
22f90 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
22fa0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
22fb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22fc0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
22fd0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
22fe0 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
22ff0 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
23000 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
23010 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
23020 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
23030 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
23040 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
23050 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23060 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
23070 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
23080 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
23090 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
230a0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
230b0 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
230c0 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
230d0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
230e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
230f0 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
23100 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
23110 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
23120 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
23130 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
23140 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
23150 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
23160 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
23170 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
23180 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
23190 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
231a0 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
231b0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
231c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
231d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
231e0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
231f0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
23200 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
23210 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
23220 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
23230 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
23240 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
23250 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
23260 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
23270 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
23280 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
23290 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
232a0 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
232b0 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
232c0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
232d0 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
232e0 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
232f0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
23300 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
23310 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
23320 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
23330 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
23340 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
23350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
23360 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
23370 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
23380 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
23390 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
233a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
233b0 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
233c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
233d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
233e0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
233f0 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
23400 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
23410 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
23420 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
23430 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
23440 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
23450 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
23460 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
23470 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
23480 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
23490 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
234a0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
234b0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
234c0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
234d0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
234e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
234f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23500 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
23510 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
23520 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
23530 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
23540 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
23550 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
23560 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
23570 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
23580 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
23590 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
235a0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
235b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
235c0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
235d0 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
235e0 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
235f0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
23600 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
23610 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
23620 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
23630 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
23640 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
23650 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
23660 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
23670 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
23680 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
23690 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
236a0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
236b0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
236c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
236d0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
236e0 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
236f0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
23700 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
23710 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
23720 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
23730 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
23740 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
23750 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
23760 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
23770 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
23780 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
23790 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
237a0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
237b0 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
237c0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
237d0 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
237e0 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
237f0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
23800 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
23810 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
23820 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
23830 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
23840 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
23850 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
23860 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
23870 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
23880 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
23890 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
238a0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
238b0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
238c0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
238d0 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
238e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
238f0 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
23900 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
23910 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
23920 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
23930 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
23940 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
23950 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
23960 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23970 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
23980 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
23990 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
239a0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
239b0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
239c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
239d0 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
239e0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
239f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
23a00 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
23a10 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
23a20 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
23a30 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
23a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
23a50 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
23a60 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
23a70 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
23a80 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
23a90 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
23aa0 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
23ab0 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
23ac0 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
23ad0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
23ae0 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
23af0 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
23b00 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
23b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
23b20 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
23b30 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
23b40 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
23b50 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
23b60 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
23b70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
23b80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
23b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23ba0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
23bb0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
23bc0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
23bd0 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
23be0 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
23bf0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
23c00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
23c10 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
23c20 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
23c30 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
23c40 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
23c50 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
23c60 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
23c70 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
23c80 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
23c90 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
23ca0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
23cb0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
23cc0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
23cd0 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
23ce0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
23cf0 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
23d00 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
23d10 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
23d20 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
23d30 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
23d40 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
23d50 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
23d60 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
23d70 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
23d80 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
23d90 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
23da0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
23db0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
23dc0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
23dd0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
23de0 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
23df0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
23e00 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
23e10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23e20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
23e30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
23e40 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
23e50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
23e60 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
23e70 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
23e80 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
23e90 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
23ea0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
23eb0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
23ec0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
23ed0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
23ee0 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
23ef0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
23f00 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  (p);.    if( op=
23f10 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
23f20 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
23f30 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
23f40 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
23f50 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23f70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23f80 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
23f90 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
23fa0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
23fb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23fd0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
23fe0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
23ff0 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
24000 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
24010 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
24020 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
24030 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
24040 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
24050 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
24060 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
24070 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
24080 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
24090 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
240a0 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
240b0 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
240c0 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
240d0 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
240e0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
240f0 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
24100 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
24110 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
24120 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
24130 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
24140 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
24150 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24160 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
24170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
24190 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
241a0 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
241b0 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
241c0 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
241d0 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
241e0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
241f0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
24200 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
24210 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
24220 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
24230 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
24240 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
24250 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
24260 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
24270 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
24280 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
24290 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
242a0 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
242b0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
242c0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
242d0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
242e0 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63  t of wrFlag is c
242f0 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
24300 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a  ursor can only.*
24310 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  * be used for re
24320 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42  ading.  If the B
24330 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 69  TREE_WRCSR bit i
24340 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
24350 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65  cursor.** can be
24360 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
24370 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67  g or for writing
24380 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
24390 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
243a0 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  .** are also met
243b0 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65  .  These are the
243c0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
243d0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
243e0 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69  order.** for wri
243f0 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77  ting to be allow
24400 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
24410 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
24420 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
24430 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61  ith wrFlag conta
24440 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53  ining BTREE_WRCS
24450 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  R.**.** 2:  Othe
24460 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
24470 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
24480 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
24490 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
244a0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
244b0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
244c0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
244d0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
244e0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
244f0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
24500 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
24510 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
24520 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
24530 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
24540 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
24550 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
24560 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
24570 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
24580 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
24590 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
245a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
245b0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
245c0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
245d0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
245e0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
245f0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
24600 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
24610 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45   BTREE_FORDELETE
24620 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d   bit of wrFlag m
24630 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65  ay optionally be
24640 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57 52   set if BTREE_WR
24650 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20  CSR.** is set.  
24660 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20  If FORDELETE is 
24670 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68  set, that is a h
24680 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
24690 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a  mentation that.*
246a0 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69  * this cursor wi
246b0 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ll only be used 
246c0 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64  to seek to and d
246d0 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66  elete entries of
246e0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20   an index.** as 
246f0 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72  part of a larger
24700 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
24710 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54  t.  The FORDELET
24720 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73  E hint is not us
24730 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d  ed by.** this im
24740 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42  plementation.  B
24750 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74  ut in a hypothet
24760 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65  ical alternative
24770 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20   storage engine 
24780 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64  .** in which ind
24790 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ex entries are a
247a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
247b0 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73  eted when corres
247c0 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a  ponding table.**
247d0 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65   rows are delete
247e0 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45  d, the FORDELETE
247f0 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20   flag is a hint 
24800 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e  that all SEEK an
24810 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72  d DELETE.** oper
24820 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63  ations on this c
24830 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d  ursor can be no-
24840 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44  ops and all READ
24850 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20   operations can 
24860 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c  .** return a nul
24870 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20  l row (2-bytes: 
24880 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a  0x01 0x00)..**.*
24890 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
248a0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
248b0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
248c0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
248d0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
248e0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
248f0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
24900 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
24910 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
24920 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
24930 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
24940 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
24950 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
24960 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
24970 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
24980 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
24990 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
249a0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
249b0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
249c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
249d0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
249e0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
24a10 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
24a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a40 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
24a50 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
24a60 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
24a90 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
24aa0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
24ab0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ad0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
24ae0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
24af0 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
24b00 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b20 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
24b30 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
24b40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
24b50 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
24b60 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
24b70 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
24b80 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20    BtCursor *pX; 
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
24bb0 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61  ing over other a
24bc0 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20  ll cursors */.. 
24bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24be0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
24bf0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
24c00 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20  wrFlag==0 .     
24c10 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52    || wrFlag==BTR
24c20 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20  EE_WRCSR .      
24c30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52   || wrFlag==(BTR
24c40 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46  EE_WRCSR|BTREE_F
24c50 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a  ORDELETE) .  );.
24c60 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
24c70 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
24c80 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
24c90 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
24ca0 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
24cb0 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
24cc0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
24cd0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
24ce0 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
24cf0 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
24d00 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
24d10 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
24d20 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
24d30 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
24d40 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
24d50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
24d60 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
24d70 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
24d80 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72  pKeyInfo!=0, (wr
24d90 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20  Flag?2:1)) );.  
24da0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24db0 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
24dc0 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
24dd0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
24de0 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
24df0 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
24e00 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
24e10 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
24e20 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
24e30 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
24e40 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
24e50 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
24e60 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
24e70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
24e80 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
24e90 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
24ea0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24eb0 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 || (pBt->btsFl
24ec0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
24ed0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  NLY)==0 );..  if
24ee0 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
24ef0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
24f00 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
24f10 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d  pBt->pTmpSpace==
24f20 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
24f30 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
24f40 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
24f50 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
24f60 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
24f70 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
24f80 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
24f90 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
24fa0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
24fb0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
24fc0 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
24fd0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
24fe0 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
24ff0 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
25000 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
25010 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
25020 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
25030 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
25040 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
25050 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
25060 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
25070 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
25080 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
25090 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
250a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
250b0 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72  wrFlag ? BTCF_Wr
250c0 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70  iteFlag : 0;.  p
250d0 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
250e0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20  gs = wrFlag ? 0 
250f0 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  : PAGER_GET_READ
25100 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68  ONLY;.  /* If th
25110 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
25120 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
25130 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
25140 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a  hen all such.  *
25150 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a  * cursors *must*
25160 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d   have the BTCF_M
25170 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
25180 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42  . */.  for(pX=pB
25190 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20  t->pCursor; pX; 
251a0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
251b0 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52     if( pX->pgnoR
251c0 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c  oot==(Pgno)iTabl
251d0 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63  e ){.      pX->c
251e0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
251f0 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20  Multiple;.      
25200 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
25210 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
25220 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
25230 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
25240 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e  pCursor;.  pBt->
25250 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
25260 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
25270 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
25280 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25290 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
252a0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
252b0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
252f0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
25320 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
25330 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
25340 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
25370 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
25380 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
25390 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
253a0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
253b0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
253c0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
253d0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
253e0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
25410 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
25420 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
25430 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20   iTable<1 ){.   
25440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25450 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
25460 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
25470 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
25480 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
25490 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
254a0 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
254b0 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  pCur);.    sqlit
254c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
254d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
254e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
254f0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
25500 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
25510 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
25520 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
25530 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
25540 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
25550 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
25560 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
25570 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
25580 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
25590 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
255a0 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
255b0 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
255c0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
255d0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
255e0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
255f0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
25600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25610 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
25620 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
25630 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
25640 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
25650 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
25660 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
25670 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
25680 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
25690 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
256a0 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
256b0 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
256c0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
256d0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
256e0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
256f0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
25700 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
25710 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
25720 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
25730 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
25740 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
25750 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
25760 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
25770 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
25780 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
25790 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
257a0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
257b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
257c0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
257d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
257e0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
257f0 2c 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54  , BTCURSOR_FIRST
25800 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a  _UNINIT));.}../*
25810 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
25820 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
25830 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
25840 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
25850 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
25860 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
25870 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
25880 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
25890 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
258a0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
258b0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
258c0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
258d0 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ree ){.    BtSha
258e0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
258f0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
25900 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
25910 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
25920 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
25930 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
25940 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
25950 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
25960 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
25970 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
25980 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
25990 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
259a0 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
259b0 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
259c0 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
259d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
259e0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
259f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
25a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
25a10 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
25a20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
25a30 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
25a40 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
25a50 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65     }.    btreeRe
25a60 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
25a70 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75  ges(pCur);.    u
25a80 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
25a90 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
25aa0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
25ab0 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
25ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
25ad0 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71  r->pKey);.    sq
25ae0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25af0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 43 75  pBtree);.    pCu
25b00 72 2d 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20  r->pBtree = 0;. 
25b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
25b20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25b30 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
25b40 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
25b50 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
25b60 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
25b70 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
25b80 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
25b90 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
25ba0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
25bb0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
25bc0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
25bd0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
25be0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
25bf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
25c00 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
25c10 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
25c20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
25c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
25c40 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
25c50 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
25c60 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
25c70 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71  c int cellInfoEq
25c80 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c  ual(CellInfo *a,
25c90 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20   CellInfo *b){. 
25ca0 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d     if( a->nKey!=
25cb0 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e  b->nKey ) return
25cc0 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70   0;.    if( a->p
25cd0 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79  Payload!=b->pPay
25ce0 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b  load ) return 0;
25cf0 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79  .    if( a->nPay
25d00 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61  load!=b->nPayloa
25d10 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
25d20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21    if( a->nLocal!
25d30 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74  =b->nLocal ) ret
25d40 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
25d50 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a  ->nSize!=b->nSiz
25d60 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
25d70 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
25d80 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
25d90 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
25da0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25db0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
25dc0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
25dd0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
25de0 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
25df0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
25e00 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26  age, pCur->ix, &
25e10 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
25e20 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
25e30 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26   cellInfoEqual(&
25e40 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
25e50 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  o) );.  }.#else.
25e60 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
25e70 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
25e80 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  if.static SQLITE
25e90 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67  _NOINLINE void g
25ea0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
25eb0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
25ec0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
25ed0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ze==0 ){.    pCu
25ee0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
25ef0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
25f00 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
25f10 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43  l(pCur->pPage,pC
25f20 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e  ur->ix,&pCur->in
25f30 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
25f40 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
25f50 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
25f60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
25f70 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
25f80 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
25f90 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
25fa0 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
25fb0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
25fc0 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
25fd0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
25fe0 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
25ff0 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
26000 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
26010 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
26020 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
26030 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
26040 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
26050 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
26060 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
26070 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
26080 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
26090 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
260a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
260b0 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
260c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
260d0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
260e0 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
260f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26100 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
26110 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  NN(BtCursor *pCu
26120 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  r){.  assert( pC
26130 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ur!=0 );.  retur
26140 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  n pCur->eState==
26150 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
26160 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
26170 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
26180 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72  nteger key or "r
26190 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c  owid" for a tabl
261a0 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73  e btree..** This
261b0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
261c0 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72   valid for a cur
261d0 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
261e0 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f  ting into a.** o
261f0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74  rdinary table bt
26200 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ree.  If the cur
26210 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  sor points to an
26220 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a   index btree or.
26230 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74  ** is invalid, t
26240 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69  he result of thi
26250 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64  s routine is und
26260 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73  efined..*/.i64 s
26270 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
26280 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  erKey(BtCursor *
26290 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
262a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
262b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
262c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
262d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
262e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
262f0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
26300 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
26310 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
26320 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d  ur->info.nKey;.}
26330 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26340 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51  ENABLE_OFFSET_SQ
26350 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74  L_FUNC./*.** Ret
26360 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69  urn the offset i
26370 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
26380 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74   file for the st
26390 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  art of the.** pa
263a0 79 6c 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74  yload to which t
263b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
263c0 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71  nting..*/.i64 sq
263d0 6c 69 74 65 33 42 74 72 65 65 4f 66 66 73 65 74  lite3BtreeOffset
263e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
263f0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
26400 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26410 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26420 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26430 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26440 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
26450 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34  );.  return (i64
26460 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  )pCur->pBt->page
26470 53 69 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d  Size*((i64)pCur-
26480 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31  >pPage->pgno - 1
26490 29 20 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36  ) +.         (i6
264a0 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  4)(pCur->info.pP
264b0 61 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70  ayload - pCur->p
264c0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a  Page->aData);.}.
264d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
264e0 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53  _ENABLE_OFFSET_S
264f0 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a  QL_FUNC */../*.*
26500 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
26510 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
26520 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
26530 65 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20  entry that pCur 
26540 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
26550 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f  pointing to.  Fo
26560 72 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20  r table btrees, 
26570 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
26580 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61   amount.** of da
26590 74 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62  ta.  For index b
265a0 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
265b0 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20   be the size of 
265c0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
265d0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67  he caller must g
265e0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
265f0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
26600 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  ting to a non-NU
26610 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72  LL.** valid entr
26620 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
26630 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ds, the calling 
26640 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67  procedure must g
26650 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74  uarantee.** that
26660 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
26670 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43  Cursor.eState==C
26680 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a  URSOR_VALID..*/.
26690 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
266a0 50 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75  PayloadSize(BtCu
266b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
266c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
266d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
266e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
266f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26700 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
26710 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
26720 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
26730 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f  o.nPayload;.}../
26740 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 75  *.** Return an u
26750 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
26760 65 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 72 65  e size of any re
26770 63 6f 72 64 20 66 6f 72 20 74 68 65 20 74 61 62  cord for the tab
26780 6c 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  le.** that the c
26790 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
267a0 67 20 69 6e 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  g into..**.** Th
267b0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
267c0 61 74 69 6f 6e 2e 20 20 45 76 65 72 79 74 68 69  ation.  Everythi
267d0 6e 67 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  ng will still wo
267e0 72 6b 20 69 66 20 74 68 69 73 0a 2a 2a 20 72 6f  rk if this.** ro
267f0 75 74 69 6e 65 20 61 6c 77 61 79 73 20 72 65 74  utine always ret
26800 75 72 6e 73 20 32 31 34 37 34 38 33 36 34 37 20  urns 2147483647 
26810 28 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 61  (which is the la
26820 72 67 65 73 74 20 72 65 63 6f 72 64 0a 2a 2a 20  rgest record.** 
26830 74 68 61 74 20 53 51 4c 69 74 65 20 63 61 6e 20  that SQLite can 
26840 68 61 6e 64 6c 65 29 20 6f 72 20 6d 6f 72 65 2e  handle) or more.
26850 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 20    But returning 
26860 61 20 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 20  a smaller value 
26870 6d 69 67 68 74 0a 2a 2a 20 70 72 65 76 65 6e 74  might.** prevent
26880 20 6c 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c   large memory al
26890 6c 6f 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 74  locations when t
268a0 72 79 69 6e 67 20 74 6f 20 69 6e 74 65 72 70 72  rying to interpr
268b0 65 74 20 61 0a 2a 2a 20 63 6f 72 72 75 70 74 20  et a.** corrupt 
268c0 64 61 74 72 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a  datrabase..**.**
268d0 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
268e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 65 72 65  lementation mere
268f0 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  ly returns the s
26900 69 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72  ize of the under
26910 6c 79 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  lying.** databas
26920 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e file..*/.sqlit
26930 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
26940 42 74 72 65 65 4d 61 78 52 65 63 6f 72 64 53 69  BtreeMaxRecordSi
26950 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
26960 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
26970 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26980 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26990 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
269a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
269b0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70    return pCur->p
269c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  Bt->pageSize * (
269d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 43  sqlite3_int64)pC
269e0 75 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  ur->pBt->nPage;.
269f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
26a00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
26a10 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
26a20 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
26a30 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
26a40 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
26a50 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
26a60 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
26a70 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
26a80 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
26a90 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
26aa0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
26ab0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
26ac0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
26ad0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
26ae0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
26af0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
26b00 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
26b10 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
26b20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
26b30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
26b40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26b50 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
26b60 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
26b70 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
26b80 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
26b90 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
26ba0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
26bb0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
26bc0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
26bd0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
26be0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
26bf0 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
26c00 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
26c10 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
26c20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
26c30 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26c40 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
26c50 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
26c60 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
26c70 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
26c80 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
26c90 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
26ca0 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
26cb0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
26cc0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
26cd0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
26ce0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
26cf0 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
26d00 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
26d10 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
26d20 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
26d30 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
26d40 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
26d50 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
26d60 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
26d70 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
26d80 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
26d90 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
26da0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
26db0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
26dc0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
26dd0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26de0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
26df0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
26e00 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
26e10 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
26e20 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
26e30 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
26e40 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
26e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26e60 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
26e70 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
26e80 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
26e90 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
26ea0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
26eb0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
26ec0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
26ed0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
26ee0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
26ef0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26f00 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
26f10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26f20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
26f30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
26f40 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
26f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26f60 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
26f70 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
26f80 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
26f90 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
26fa0 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
26fb0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
26fc0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
26fd0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
26fe0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
26ff0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
27000 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
27010 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
27020 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
27030 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
27040 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
27050 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
27060 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
27070 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
27080 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
27090 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
270a0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
270b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
270c0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
270d0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
270e0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
270f0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
27100 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
27110 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
27120 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
27130 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
27140 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
27150 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
27160 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
27170 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
27180 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
27190 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
271a0 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
271b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
271c0 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
271d0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
271e0 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
271f0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
27200 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
27210 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
27220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27230 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
27240 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
27250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
27260 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
27270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
27280 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
27290 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
272a0 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
272b0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
272c0 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
272d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
272e0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
272f0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
27300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27310 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
27320 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
27330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
27340 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
27350 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
27360 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
27370 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
27380 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
27390 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
273a0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
273b0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
273c0 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
273d0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
273e0 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
273f0 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
27400 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
27410 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
27420 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
27430 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
27440 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
27450 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
27460 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
27470 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
27480 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
27490 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
274a0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
274b0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
274c0 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
274d0 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
274e0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
274f0 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
27500 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
27510 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
27520 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
27530 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
27540 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
27550 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
27560 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
27570 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
27580 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
27590 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
275a0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
275b0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
275c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
275d0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
275e0 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
275f0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
27600 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27610 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
27620 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
27630 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27640 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
27650 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
27680 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
27690 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
276a0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
276b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
276c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
276d0 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
276e0 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
276f0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
27700 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
27710 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
27720 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
27730 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27740 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
27750 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
27770 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27780 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
27790 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
277a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
277b0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
277c0 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
277d0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
277e0 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
277f0 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
27800 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
27810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27820 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27830 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
27840 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
27850 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
27860 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
27870 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
27880 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
27890 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
278a0 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
278b0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
278c0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
278d0 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
278e0 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
278f0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
27900 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
27910 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
27920 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
27930 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
27940 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
27950 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
27960 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
27970 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
27980 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
27990 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
279a0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
279b0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
279c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
279d0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
279e0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
279f0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
27a00 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
27a10 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
27a20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
27a30 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
27a40 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
27a50 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
27a60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
27a70 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68  flow pages.** th
27a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
27a90 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
27aa0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
27ab0 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76  pulate.** the ov
27ac0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27ad0 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
27ae0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
27af0 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
27b00 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
27b10 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
27b20 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
27b30 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
27b40 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
27b50 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
27b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
27b70 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
27b80 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
27b90 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
27ba0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
27bb0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
27bc0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
27bd0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
27be0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
27bf0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
27c00 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
27c10 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
27c20 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
27c30 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
27c40 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
27c50 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
27c60 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
27c70 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
27c80 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
27c90 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
27ca0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
27cb0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
27cc0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
27cd0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
27ce0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
27cf0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
27d00 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
27d10 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
27d20 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
27d30 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
27d40 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
27d50 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
27d60 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
27d70 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
27d80 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
27d90 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
27da0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
27db0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
27dc0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
27dd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
27de0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
27df0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
27e00 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
27e10 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
27e20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
27e30 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
27e40 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
27e50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
27e60 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
27e70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27e80 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
27e90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
27ea0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20   pCur->pPage;   
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
27ec0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
27ed0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
27ee0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
27ef0 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
27f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
27f10 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
27f20 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
27f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
27f40 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
27f50 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
27f60 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
27f70 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20  art = pBuf;     
27f80 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67  /* Start of orig
27f90 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20  inal out buffer 
27fa0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
27fb0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
27fc0 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c  assert( eOp==0 |
27fd0 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73  | eOp==1 );.  as
27fe0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27ff0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28010 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
28020 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
28030 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28040 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
28050 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
28060 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
28070 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
28080 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  d;.  assert( off
28090 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
280a0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
280b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61  ;..  assert( aPa
280c0 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61  yload > pPage->a
280d0 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75  Data );.  if( (u
280e0 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20  ptr)(aPayload - 
280f0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20  pPage->aData) > 
28100 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
28110 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   - pCur->info.nL
28120 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
28130 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
28140 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
28150 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
28160 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   is an error.  T
28170 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  he.    ** condit
28180 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72  ional above is r
28190 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20  eally:.    **   
281a0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
281b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
281c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
281d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
281e0 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63     ** but is rec
281f0 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72  ast into its cur
28200 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f  rent form to avo
28210 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  id integer overf
28220 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20  low problems.   
28230 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
28240 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
28250 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  GE(pPage);.  }..
28260 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
28270 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
28280 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
28290 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
282a0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
282b0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
282c0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
282d0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
282e0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
282f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
28300 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
28310 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
28320 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
28330 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
28340 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
28350 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
28360 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
28370 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
28380 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
28390 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
283a0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
283b0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
283c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
283d0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
283e0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
283f0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
28400 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
28410 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
28420 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
28430 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
28440 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
28450 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
28460 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
28470 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
28480 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
28490 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
284a0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
284b0 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
284c0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
284d0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
284e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
284f0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
28500 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
28510 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
28520 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
28530 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
28540 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
28550 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
28560 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
28570 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
28580 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
28590 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
285a0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
285b0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
285c0 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
285d0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
285e0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
285f0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
28600 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28610 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28620 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
28630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
28640 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
28650 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
28660 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28670 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
28680 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
28690 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
286a0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f  ==0.       || nO
286b0 76 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28  vfl*(int)sizeof(
286c0 50 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d  Pgno) > sqlite3M
286d0 61 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e  allocSize(pCur->
286e0 61 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20  aOverflow).     
286f0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
28700 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29   *aNew = (Pgno*)
28710 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
28720 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
28730 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
28740 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
28750 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
28760 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
28770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
28780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28790 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
287a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
287b0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
287c0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
287d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
287e0 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f   memset(pCur->aO
287f0 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66  verflow, 0, nOvf
28800 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b  l*sizeof(Pgno));
28810 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
28820 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
28830 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c  lidOvfl;.    }el
28840 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
28850 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
28860 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
28870 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
28880 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
28890 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
288a0 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
288b0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
288c0 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20  alid, skip.     
288d0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
288e0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
288f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
28900 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
28910 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
28920 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
28930 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
28940 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
28950 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
28960 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f  iIdx];.        o
28970 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
28980 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
28990 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
289a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
289b0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a  _OK && amt>0 );.
289c0 20 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50      while( nextP
289d0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  age ){.      /* 
289e0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
289f0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
28a00 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
28a10 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  he. */.      ass
28a20 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72  ert( pCur->aOver
28a30 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20  flow[iIdx]==0.  
28a40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
28a50 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28a60 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20  Idx]==nextPage. 
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
28a80 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
28a90 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
28aa0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
28ab0 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28  Page;..      if(
28ac0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
28ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
28ae0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
28af0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
28b00 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
28b10 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
28b20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
28b30 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
28b40 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
28b50 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
28b60 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
28b70 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
28b80 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
28b90 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
28ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
28bb0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
28bc0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
28bd0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
28be0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
28bf0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
28c00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28c10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28c20 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
28c30 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
28c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28c50 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
28c60 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20  ==pBt->db );.   
28c70 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
28c80 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
28c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
28ca0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
28cb0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
28cc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28cd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28ce0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
28cf0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
28d00 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
28d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28d20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
28d30 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
28d40 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
28d50 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
28d60 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
28d70 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
28d80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28d90 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
28da0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
28db0 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
28dc0 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
28dd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28de0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
28df0 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
28e00 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
28e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
28e20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
28e30 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
28e40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
28e50 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
28e60 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
28e70 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
28e80 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
28e90 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28ea0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
28eb0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
28ec0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
28ed0 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
28ee0 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
28ef0 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
28f00 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
28f10 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
28f20 29 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  ) there are no d
28f30 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
28f40 65 20 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20  e page-cache.   
28f50 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
28f60 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
28f70 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
28f80 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
28f90 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
28fa0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20   the WAL file.  
28fb0 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74        **   6) at
28fc0 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
28fd0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
28fe0 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
28ff0 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
29000 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29010 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
29020 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
29030 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
29040 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
29050 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
29060 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
29070 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
29080 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
29090 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
290a0 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
290b0 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
290c0 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
290d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
290e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
290f0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20      if( eOp==0  
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
29130 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
29140 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29170 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
29180 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
29190 33 50 61 67 65 72 44 69 72 65 63 74 52 65 61 64  3PagerDirectRead
291a0 4f 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  Ok(pBt->pPager, 
291b0 6e 65 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20  nextPage)    /* 
291c0 28 33 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20  (3,4,5) */.     
291d0 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
291e0 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
29210 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
29220 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29230 5f 66 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69  _file *fd = sqli
29240 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
29250 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
29260 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
29270 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
29280 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
29290 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  4];.          as
292a0 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42  sert( aWrite>=pB
292b0 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20  ufStart );      
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292d0 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29     /* due to (6)
292e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
292f0 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
29300 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
29310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29320 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
29330 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
29340 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
29350 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
29360 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
29370 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
29380 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29390 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
293a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
293b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
293c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
293d0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
293e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
293f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
29400 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
29410 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20  ge, &pDbPage,.  
29420 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4f 70              (eOp
29430 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
29440 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
29450 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29460 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29480 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
29490 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
294a0 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
294b0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
294c0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
294d0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
294e0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
294f0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
29500 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
29510 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
29520 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
29530 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29540 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
29550 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
29560 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
29570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29580 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
29590 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29      if( amt==0 )
295a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
295b0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
295c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
295d0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
295e0 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d     iIdx++;.    }
295f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
29600 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
29610 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  >0 ){.    /* Ove
29620 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73  rflow chain ends
29630 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a   prematurely */.
29640 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29650 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
29660 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
29670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29680 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
29690 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68  e payload for th
296a0 65 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74  e row at which t
296b0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
296c0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
296d0 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22  pointing.  "amt"
296e0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
296f0 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20  ransferred into 
29700 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
29710 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
29720 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
29730 2a 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70  ** pCur can be p
29740 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65  ointing to eithe
29750 72 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20  r a table or an 
29760 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a  index b-tree..**
29770 20 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   If pointing to 
29780 61 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74  a table btree, t
29790 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
297a0 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
297b0 20 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20    If.** pCur is 
297c0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69  pointing to an i
297d0 6e 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e  ndex b-tree then
297e0 20 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e   the key section
297f0 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
29800 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
29810 50 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63  Payload(), the c
29820 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
29830 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
29840 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
29850 76 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65  valid row in the
29860 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c   table.  For sql
29870 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
29880 43 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a  Checked(), the.*
29890 2a 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62  * cursor might b
298a0 65 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67  e invalid or mig
298b0 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ht need to be re
298c0 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65  stored before be
298d0 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ing read..**.** 
298e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
298f0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
29900 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
29910 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
29920 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
29930 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
29940 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
29950 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
29960 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
29970 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
29980 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
29990 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
299a0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
299b0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
299c0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
299d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
299e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
299f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29a00 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29a10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29a20 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
29a30 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
29a40 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
29a50 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
29a60 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
29a70 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
29a80 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
29a90 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
29aa0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
29ab0 20 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66   This variant of
29ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
29ad0 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65  load() works eve
29ae0 6e 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  n if the cursor 
29af0 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68  has not.** in th
29b00 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73  e CURSOR_VALID s
29b10 74 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c  tate.  It is onl
29b20 79 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71  y used by the sq
29b30 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
29b40 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a  ).** interface..
29b50 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
29b60 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
29b70 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
29b80 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73  INLINE int acces
29b90 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  sPayloadChecked(
29ba0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
29bb0 72 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  r,.  u32 offset,
29bc0 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f  .  u32 amt,.  vo
29bd0 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e  id *pBuf.){.  in
29be0 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75  t rc;.  if ( pCu
29bf0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29c00 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
29c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
29c20 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BORT;.  }.  asse
29c30 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
29c40 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
29c50 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74    rc = btreeRest
29c60 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
29c70 6e 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  n(pCur);.  retur
29c80 6e 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65  n rc ? rc : acce
29c90 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
29ca0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
29cb0 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  f, 0);.}.int sql
29cc0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
29cd0 43 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72  Checked(BtCursor
29ce0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
29cf0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
29d00 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20  d *pBuf){.  if( 
29d10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29d20 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
29d30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29d40 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29d50 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r) );.    return
29d60 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29d70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29d80 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65  , pBuf, 0);.  }e
29d90 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
29da0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
29db0 63 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65  cked(pCur, offse
29dc0 74 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20  t, amt, pBuf);. 
29dd0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
29de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
29df0 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  LOB */../*.** Re
29e00 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
29e10 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
29e20 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
29e30 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
29e40 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
29e50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
29e60 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
29e70 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
29e80 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
29e90 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
29ea0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
29eb0 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
29ec0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
29ed0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
29ee0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
29ef0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
29f00 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
29f10 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
29f20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
29f30 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
29f40 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
29f50 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
29f60 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
29f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
29f80 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
29f90 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
29fa0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
29fb0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
29fc0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
29fd0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
29fe0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
29ff0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
2a000 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
2a010 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
2a020 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
2a030 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
2a040 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
2a050 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
2a060 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
2a070 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
2a080 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
2a090 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
2a0a0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
2a0b0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
2a0c0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
2a0d0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
2a0e0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
2a0f0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
2a100 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
2a110 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
2a120 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
2a130 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
2a140 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
2a150 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
2a160 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
2a170 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
2a180 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
2a190 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
2a1a0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
2a1b0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2a1c0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
2a1d0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
2a1e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2a1f0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
2a200 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
2a210 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
2a220 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
2a230 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2a240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
2a250 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
2a260 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d  e */.){.  int am
2a270 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
2a280 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
2a290 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
2a2a0 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74  pPage);.  assert
2a2b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a2c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a2d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a2e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2a2f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2a300 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2a310 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a320 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a340 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
2a350 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2a360 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2a370 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ze>0 );.  assert
2a380 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2a390 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67  yload>pCur->pPag
2a3a0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52  e->aData || CORR
2a3b0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
2a3c0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
2a3d0 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50  Payload<pCur->pP
2a3e0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  age->aDataEnd ||
2a3f0 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
2a400 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
2a410 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d  nLocal;.  if( am
2a420 74 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50  t>(int)(pCur->pP
2a430 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  age->aDataEnd - 
2a440 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2a450 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  oad) ){.    /* T
2a460 68 65 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74  here is too litt
2a470 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  le space on the 
2a480 70 61 67 65 20 66 6f 72 20 74 68 65 20 65 78 70  page for the exp
2a490 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20  ected amount.   
2a4a0 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e   ** of local con
2a4b0 74 65 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d  tent. Database m
2a4c0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2a4d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  */.    assert( C
2a4e0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
2a4f0 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69   amt = MAX(0, (i
2a500 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  nt)(pCur->pPage-
2a510 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
2a520 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
2a530 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
2a540 20 28 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74   (u32)amt;.  ret
2a550 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
2a560 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
2a570 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
2a580 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
2a590 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
2a5a0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
2a5b0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
2a5c0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
2a5d0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
2a5e0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
2a5f0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2a600 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
2a610 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
2a620 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
2a630 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
2a640 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
2a650 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
2a660 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
2a670 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
2a680 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
2a690 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
2a6a0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
2a6b0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
2a6c0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
2a6d0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
2a6e0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
2a6f0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
2a700 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
2a710 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
2a720 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
2a730 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
2a740 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
2a750 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
2a760 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
2a770 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
2a780 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
2a790 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
2a7a0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
2a7b0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
2a7c0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50  d *sqlite3BtreeP
2a7d0 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75  ayloadFetch(BtCu
2a7e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2a7f0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
2a800 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
2a810 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
2a820 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2a830 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
2a840 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
2a850 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
2a860 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
2a870 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2a880 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
2a890 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
2a8a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2a8b0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
2a8c0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
2a8d0 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
2a8e0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
2a8f0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
2a900 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
2a910 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
2a920 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
2a930 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
2a940 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
2a950 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
2a960 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
2a970 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
2a980 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
2a990 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
2a9a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a9b0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
2a9c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a9d0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
2a9e0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a9f0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2aa00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aa10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2aa20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2aa30 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
2aa40 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
2aa50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
2aa60 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2aa70 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
2aa80 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
2aa90 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
2aaa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2aab0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2aac0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   }.  pCur->info.
2aad0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2aae0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2aaf0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2ab00 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2ab10 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
2ab20 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43  Cur->iPage] = pC
2ab30 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e  ur->ix;.  pCur->
2ab40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ab50 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  ge] = pCur->pPag
2ab60 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  e;.  pCur->ix = 
2ab70 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
2ab80 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74  ++;.  return get
2ab90 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2aba0 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d   newPgno, &pCur-
2abb0 3e 70 50 61 67 65 2c 20 70 43 75 72 2c 20 70 43  >pPage, pCur, pC
2abc0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2abd0 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  s);.}..#ifdef SQ
2abe0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
2abf0 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
2ac00 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
2ac10 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
2ac20 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2ac30 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
2ac40 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
2ac50 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
2ac60 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
2ac70 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
2ac80 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
2ac90 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
2aca0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
2acb0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
2acc0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
2acd0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
2ace0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
2acf0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
2ad00 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2ad10 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
2ad20 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
2ad30 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
2ad40 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
2ad50 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52  ild){.  if( CORR
2ad60 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
2ad70 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69    /* The conditi
2ad80 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77  ons tested below
2ad90 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72   might not be tr
2ada0 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2adc0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  * in a corrupt d
2add0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73  atabase */.  ass
2ade0 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
2adf0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
2ae00 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
2ae10 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
2ae20 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2ae30 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2ae40 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2ae50 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
2ae60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2ae70 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
2ae80 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
2ae90 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
2aea0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2aeb0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
2aec0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
2aed0 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
2aee0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2aef0 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
2af00 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
2af10 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
2af20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
2af30 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
2af40 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
2af50 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
2af60 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
2af70 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
2af80 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
2af90 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
2afa0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
2afb0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
2afc0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
2afd0 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
2afe0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
2aff0 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
2b000 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2b010 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65  {.  MemPage *pLe
2b020 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  af;.  assert( cu
2b030 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b040 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b050 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b060 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2b070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b080 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
2b090 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2b0a0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  ge );.  assertPa
2b0b0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
2b0c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b0d0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2b0e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b0f0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
2b100 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70    pCur->pPage->p
2b110 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
2b120 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
2b130 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
2b140 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
2b150 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
2b160 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
2b170 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2b180 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2b190 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2b1a0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2b1b0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78  vfl);.  pCur->ix
2b1c0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2b1d0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
2b1e0 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70   pLeaf = pCur->p
2b1f0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50  Page;.  pCur->pP
2b200 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2b210 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65  ge[--pCur->iPage
2b220 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ];.  releasePage
2b230 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a  NotNull(pLeaf);.
2b240 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2b250 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
2b260 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
2b270 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
2b280 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
2b290 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
2b2a0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
2b2b0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
2b2c0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
2b2d0 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
2b2e0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
2b2f0 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
2b300 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2b310 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
2b320 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
2b330 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
2b340 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
2b350 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
2b360 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
2b370 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
2b380 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2b390 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
2b3a0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
2b3b0 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
2b3c0 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
2b3d0 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
2b3e0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
2b3f0 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
2b400 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61  CURSOR_INVALID a
2b410 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
2b420 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
2b430 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c  MPTY. Otherwise,
2b440 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
2b450 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
2b460 6f 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  o the first cell
2b470 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
2b480 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74  root.** (or virt
2b490 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
2b4a0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
2b4b0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
2b4c0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
2b4d0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
2b4e0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
2b4f0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
2b500 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
2b510 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
2b520 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
2b530 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
2b540 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
2b550 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
2b560 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
2b570 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
2b580 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
2b590 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
2b5a0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
2b5b0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
2b5c0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
2b5d0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
2b5e0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
2b5f0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
2b600 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
2b610 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
2b620 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
2b630 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
2b640 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
2b650 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
2b660 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
2b670 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
2b680 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
2b690 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
2b6a0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
2b6b0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2b6c0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
2b6d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2b6e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b6f0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2b710 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
2b720 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2b730 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2b740 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
2b750 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b760 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2b770 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
2b780 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2b790 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2b7a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20   pCur->eState < 
2b7b0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b7c0 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  EK || pCur->iPag
2b7d0 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e<0 );.  assert(
2b7e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e   pCur->pgnoRoot>
2b7f0 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
2b800 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  <0 );..  if( pCu
2b810 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
2b820 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2b830 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  ge ){.      rele
2b840 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2b850 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
2b860 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72     while( --pCur
2b870 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2b880 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2b890 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
2b8a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
2b8b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b8c0 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
2b8d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
2b8e0 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69       goto skip_i
2b8f0 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  nit;.    }.  }el
2b900 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
2b910 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
2b920 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2b930 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2b940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b950 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b  _EMPTY;.  }else{
2b960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b970 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
2b980 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
2b990 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2b9a0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
2b9b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2b9c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2b9d0 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LT ){.        as
2b9e0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2b9f0 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
2ba00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2ba10 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
2ba20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ba30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2ba40 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
2ba50 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
2ba60 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
2ba70 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
2ba80 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2ba90 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20  &pCur->pPage,.  
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bab0 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63        0, pCur->c
2bac0 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20  urPagerFlags);. 
2bad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
2baf0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2bb00 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2bb10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2bb20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
2bb30 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  age = 0;.    pCu
2bb40 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70  r->curIntKey = p
2bb50 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
2bb60 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  ey;.  }.  pRoot 
2bb70 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2bb80 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
2bb90 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
2bba0 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Root );..  /* If
2bbb0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
2bbc0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
2bbd0 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
2bbe0 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
2bbf0 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74  rsor.  ** expect
2bc00 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
2bc10 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
2bc20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2bc30 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a  pKeyInfo is.  **
2bc40 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
2bc50 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
2bc60 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
2bc70 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
2bc80 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  e,.  ** return a
2bc90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2bca0 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20   error. .  **.  
2bcb0 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ** Earlier versi
2bcc0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73  ons of SQLite as
2bcd0 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20  sumed that this 
2bce0 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66  test could not f
2bcf0 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ail.  ** if the 
2bd00 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c  root page was al
2bd10 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65  ready loaded whe
2bd20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2bd30 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e  was called (i.e.
2bd40 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69  .  ** if pCur->i
2bd50 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68  Page>=0). But th
2bd60 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20  is is not so if 
2bd70 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2bd80 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20  corrupted .  ** 
2bd90 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
2bda0 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73  at page pRoot is
2bdb0 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73   linked into a s
2bdc0 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62  econd b-tree tab
2bdd0 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65  le .  ** (or the
2bde0 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a   freelist).  */.
2bdf0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2be00 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52  >intKey==1 || pR
2be10 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  oot->intKey==0 )
2be20 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69  ;.  if( pRoot->i
2be30 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75  sInit==0 || (pCu
2be40 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
2be50 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
2be60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2be70 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
2be80 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2be90 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20   }..skip_init:  
2bea0 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b  .  pCur->ix = 0;
2beb0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2bec0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2bed0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2bee0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2bef0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2bf00 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52  alidOvfl);..  pR
2bf10 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
2bf20 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  e;.  if( pRoot->
2bf30 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
2bf40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2bf50 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
2bf60 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
2bf70 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
2bf80 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
2bf90 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
2bfa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2bfb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2bfc0 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
2bfd0 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
2bfe0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
2bff0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
2c000 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2c010 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
2c020 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2c030 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
2c040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
2c050 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2c060 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2c070 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
2c080 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  Y;.  }.  return 
2c090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2c0a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2c0b0 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
2c0c0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
2c0d0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
2c0e0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
2c0f0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2c100 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
2c110 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
2c120 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
2c130 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
2c140 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
2c150 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2c160 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2c170 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2c180 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2c190 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
2c1a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c1b0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2c1c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2c1d0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2c1e0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2c1f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2c200 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2c210 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
2c220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2c230 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
2c240 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
2c250 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c260 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  >ix<pPage->nCell
2c270 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
2c280 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c290 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  (pPage, pCur->ix
2c2a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
2c2b0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2c2c0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2c2d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c2e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c2f0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
2c300 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2c310 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2c320 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
2c330 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2c340 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
2c350 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
2c360 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
2c370 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
2c380 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2c390 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
2c3a0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2c3b0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
2c3c0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
2c3d0 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
2c3e0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
2c3f0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
2c400 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
2c410 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
2c420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
2c430 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
2c440 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2c450 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
2c460 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
2c470 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2c480 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2c490 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c4a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2c4b0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2c4c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c4d0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2c4e0 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
2c4f0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2c500 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2c510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c520 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c530 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2c540 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
2c550 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
2c560 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
2c570 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2c580 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2c590 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2c5a0 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d  Cur->ix = pPage-
2c5b0 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
2c5c0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2c5d0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
2c5e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2c5f0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78  ;.  }.  pCur->ix
2c600 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
2c610 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  1;.  assert( pCu
2c620 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2c630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2c640 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2c650 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d  BTCF_ValidNKey)=
2c660 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2c670 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
2c680 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c690 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2c6a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
2c6b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2c6c0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
2c6d0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
2c6e0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2c6f0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2c700 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2c710 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2c720 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2c730 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2c740 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
2c750 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2c760 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2c770 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
2c780 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2c790 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2c7a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c7b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2c7c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2c7d0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
2c7e0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2c7f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c810 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
2c820 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2c830 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
2c840 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2c850 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
2c860 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2c870 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73  _EMPTY ){.    as
2c880 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2c890 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2c8a0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
2c8b0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
2c8c0 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
2c8d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
2c8e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c8f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2c900 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 63 75 72  s a no-op if cur
2c910 73 6f 72 20 70 43 75 72 20 64 6f 65 73 20 6e 6f  sor pCur does no
2c920 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c  t point to a val
2c930 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f 74 68 65 72  id row..** Other
2c940 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
2c950 20 76 61 6c 69 64 2c 20 63 6f 6e 66 69 67 75 72   valid, configur
2c960 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
2c970 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a   next call to.**
2c980 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c990 74 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  t() is a no-op..
2c9a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2c9b0 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
2c9c0 43 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  C.void sqlite3Bt
2c9d0 72 65 65 53 6b 69 70 4e 65 78 74 28 42 74 43 75  reeSkipNext(BtCu
2c9e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
2c9f0 2a 20 57 65 20 62 65 6c 69 65 76 65 20 74 68 61  * We believe tha
2ca00 74 20 74 68 65 20 63 75 72 73 6f 72 20 6d 75 73  t the cursor mus
2ca10 74 20 61 6c 77 61 79 73 20 62 65 20 69 6e 20 74  t always be in t
2ca20 68 65 20 76 61 6c 69 64 20 73 74 61 74 65 20 77  he valid state w
2ca30 68 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f  hen.  ** this ro
2ca40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
2ca50 20 62 75 74 20 74 68 65 20 70 72 6f 6f 66 20 69   but the proof i
2ca60 73 20 64 69 66 66 69 63 75 6c 74 2c 20 73 6f 20  s difficult, so 
2ca70 77 65 20 61 64 64 20 61 6e 0a 20 20 2a 2a 20 41  we add an.  ** A
2ca80 4c 57 61 59 53 28 29 20 74 65 73 74 20 6a 75 73  LWaYS() test jus
2ca90 74 20 69 6e 20 63 61 73 65 20 77 65 20 61 72 65  t in case we are
2caa0 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20 20 69 66 28   wrong. */.  if(
2cab0 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
2cac0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2cad0 49 44 29 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ID) ){.    pCur-
2cae0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2caf0 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 70  _SKIPNEXT;.    p
2cb00 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2cb10 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  1;.  }.}.#endif 
2cb20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
2cb30 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a  INDOWFUNC */../*
2cb40 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2cb50 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2cb60 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
2cb70 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2cb80 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
2cb90 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
2cba0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2cbb0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2cbc0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2cbd0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2cbe0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2cbf0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2cc00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2cc10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2cc20 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2cc30 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
2cc40 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2cc50 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2cc60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2cc70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2cc80 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2cc90 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2cca0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2ccb0 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2ccc0 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2ccd0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2cce0 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2ccf0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2cd00 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2cd10 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2cd20 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2cd30 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2cd40 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2cd50 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2cd60 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2cd70 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2cd80 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2cd90 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2cda0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2cdb0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2cdc0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2cdd0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2cde0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cdf0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2ce00 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2ce10 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2ce20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2ce30 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70  Cur->ix==pCur->p
2ce40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  Page->nCell-1 );
2ce50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2ce60 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  r->pPage->leaf )
2ce70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
2ce80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ce90 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2cea0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2ceb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cec0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2ced0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cee0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2cef0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2cf00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2cf10 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2cf20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cf30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
2cf40 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2cf50 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d  CF_AtLast;.    }
2cf60 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
2cf70 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
2cf80 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
2cf90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  }.  }else if( rc
2cfa0 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29  ==SQLITE_EMPTY )
2cfb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2cfc0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2cfd0 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
2cfe0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2cff0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
2d000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d010 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2d020 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2d030 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
2d040 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
2d050 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
2d060 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
2d070 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
2d080 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
2d090 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
2d0a0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
2d0b0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
2d0c0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
2d0d0 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
2d0e0 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
2d0f0 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2d100 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
2d110 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
2d120 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
2d130 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
2d140 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
2d150 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
2d160 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
2d170 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2d180 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
2d190 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
2d1a0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
2d1b0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
2d1c0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
2d1d0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
2d1e0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
2d1f0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
2d200 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
2d210 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
2d220 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
2d230 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
2d240 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
2d250 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
2d260 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
2d270 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
2d280 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
2d290 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
2d2a0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
2d2b0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
2d2c0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
2d2d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
2d2e0 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
2d2f0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2d300 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2d310 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2d320 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
2d330 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
2d340 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
2d350 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2d360 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
2d370 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
2d380 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
2d390 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
2d3a0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
2d3b0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
2d3c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2d3d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2d3e0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d400 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2d410 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2d420 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2d430 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
2d440 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2d450 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2d460 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2d470 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
2d480 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2d490 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f  IdxKey..**.** Fo
2d4a0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2d4b0 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53  the pIdxKey->eqS
2d4c0 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74  een field is set
2d4d0 20 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a   to 1 if there.*
2d4e0 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72  * exists an entr
2d4f0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  y in the table t
2d500 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63  hat exactly matc
2d510 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a  hes pIdxKey.  .*
2d520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2d530 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
2d540 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2d550 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
2d560 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
2d570 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
2d580 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
2d590 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
2d5a0 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
2d5b0 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
2d5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d5d0 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
2d5e0 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
2d5f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
2d600 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
2d610 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
2d620 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
2d630 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
2d640 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
2d650 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
2d660 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
2d670 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78   RecordCompare x
2d680 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a  RecordCompare;..
2d690 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d6a0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2d6b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d6c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2d6d0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2d6e0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2d6f0 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
2d700 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
2d710 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2d720 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
2d730 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d740 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d750 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79  ALID || (pIdxKey
2d760 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72  ==0)==(pCur->cur
2d770 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20  IntKey!=0) );.. 
2d780 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2d790 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
2d7a0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
2d7b0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
2d7c0 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
2d7d0 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
2d7e0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
2d7f0 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
2d800 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a   if( pIdxKey==0.
2d810 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
2d820 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2d830 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2d840 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2d850 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20  NKey)!=0.  ){.  
2d860 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2d870 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2d880 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2d890 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2d8a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d8b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2d8c0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
2d8d0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  {.      if( (pCu
2d8e0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d8f0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2d900 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2d910 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74   -1;.        ret
2d920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
2d940 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
2d950 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65   key is one more
2d960 20 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f   than the previo
2d970 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20  us key, then.   
2d980 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74     ** try to get
2d990 20 74 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c   there using sql
2d9a0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2d9b0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 66 75  rather than a fu
2d9c0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61  ll.      ** bina
2d9d0 72 79 20 73 65 61 72 63 68 2e 20 20 54 68 69 73  ry search.  This
2d9e0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2d9f0 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63  ion only.  The c
2da00 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20  orrect answer.  
2da10 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2da20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74  obtained without
2da30 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79   this case, only
2da40 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73   a little more s
2da50 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20  lowely */.      
2da60 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2da70 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 29 7b  Key+1==intKey ){
2da80 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2da90 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2daa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2dab0 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
2dac0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dae0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
2daf0 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2db00 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2db10 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2db20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2db30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2db40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2db50 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2db60 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2db70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2db80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2db90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2dba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2dbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2dbc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2dbd0 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
2dbe0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
2dbf0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
2dc00 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
2dc10 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
2dc20 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
2dc30 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
2dc40 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
2dc50 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2dc60 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
2dc70 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2dc80 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2dc90 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
2dca0 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
2dcb0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
2dcc0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
2dcd0 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
2dce0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2dcf0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2dd00 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
2dd10 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a  SQLITE_EMPTY ){.
2dd20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2dd30 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2dd40 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
2dd50 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2dd60 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2dd70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dd80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2dd90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2dda0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2ddb0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
2ddc0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
2ddd0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
2dde0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2ddf0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2de00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2de10 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20  >pPage->nCell > 
2de20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2de30 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c  Cur->iPage==0 ||
2de40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2de50 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e  ->intKey==pCur->
2de60 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61  curIntKey );.  a
2de70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
2de80 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  IntKey || pIdxKe
2de90 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
2dea0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
2deb0 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
2dec0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
2ded0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2dee0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
2def0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
2df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df10 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2df20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
2df30 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
2df40 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
2df50 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
2df60 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
2df70 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
2df80 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
2df90 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
2dfa0 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
2dfb0 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
2dfc0 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
2dfd0 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
2dfe0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
2dff0 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
2e000 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
2e010 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
2e020 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2e030 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
2e040 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
2e050 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
2e060 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
2e070 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
2e080 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
2e090 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
2e0a0 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
2e0b0 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
2e0c0 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
2e0d0 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
2e0e0 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
2e0f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2e100 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2e110 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2e120 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
2e130 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
2e140 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
2e150 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
2e160 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2e170 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
2e180 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
2e190 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
2e1a0 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
2e1b0 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
2e1c0 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
2e1d0 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
2e1e0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2e1f0 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
2e200 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
2e210 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2e220 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
2e230 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
2e240 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2e250 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2e260 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2e270 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
2e280 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
2e290 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
2e2a0 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
2e2b0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
2e2c0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2e2d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e2e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2e2f0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
2e300 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2e310 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2e320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e330 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
2e340 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
2e350 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
2e360 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
2e370 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2e380 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2e390 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2e3a0 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
2e3b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2e3c0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
2e3d0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2e3e0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2e3f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2e400 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
2e410 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2e420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e430 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
2e440 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
2e450 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2e460 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2e470 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2e480 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2e490 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2e4a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2e4b0 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2e4c0 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2e4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e4e0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2e4f0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2e500 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2e510 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2e520 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
2e530 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2e540 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2e550 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2e560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2e570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e580 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2e590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e5a0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2e5b0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2e5c0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2e5d0 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2e5e0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2e5f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e600 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2e610 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
2e620 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  l;  /* Size of t
2e630 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e  he pCell cell in
2e640 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2e650 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2e660 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2e670 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20   idx);..        
2e680 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
2e690 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
2e6a0 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
2e6b0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
2e6c0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
2e6d0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2e6e0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
2e6f0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
2e700 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
2e710 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
2e720 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
2e730 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
2e740 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
2e750 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
2e760 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
2e770 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2e780 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
2e790 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
2e7a0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2e7b0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
2e7c0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
2e7d0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
2e7e0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
2e7f0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
2e800 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
2e810 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
2e820 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
2e830 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
2e840 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
2e850 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e860 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
2e870 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
2e880 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
2e890 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
2e8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2e8b0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
2e8c0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
2e8d0 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
2e8e0 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
2e8f0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
2e900 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2e910 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
2e920 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2e930 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2e940 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2e950 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2e960 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2e970 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
2e980 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2e990 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2e9a0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2e9b0 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
2e9c0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2e9d0 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
2e9e0 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
2e9f0 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
2ea00 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
2ea10 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
2ea20 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
2ea30 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
2ea40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2ea50 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2ea60 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
2ea70 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2ea80 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
2ea90 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2eaa0 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
2eab0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2eac0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2ead0 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
2eae0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2eaf0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2eb00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2eb10 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2eb20 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
2eb30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2eb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2eb50 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
2eb60 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
2eb70 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
2eb80 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
2eb90 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
2eba0 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
2ebb0 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
2ebc0 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2ebd0 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
2ebe0 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
2ebf0 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
2ec00 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
2ec10 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2ec20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
2ec30 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
2ec40 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
2ec50 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
2ec60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2ec70 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
2ec80 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
2ec90 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2eca0 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
2ecb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
2ecc0 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
2ecd0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2ece0 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
2ecf0 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
2ed00 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
2ed10 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
2ed20 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
2ed30 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
2ed40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
2ed50 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
2ed60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
2ed70 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
2ed80 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
2ed90 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
2eda0 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
2edb0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
2edc0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
2edd0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
2ede0 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
2edf0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
2ee00 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
2ee10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
2ee20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ee30 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
2ee40 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
2ee50 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
2ee60 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
2ee70 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2ee80 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
2ee90 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2eea0 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
2eeb0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2eec0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
2eed0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2eee0 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2eef0 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
2ef00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2ef10 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
2ef20 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
2ef30 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
2ef40 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2ef50 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f 70 43 75  l<2 || nCell/pCu
2ef60 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  r->pBt->usableSi
2ef70 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d 3e 6e 50  ze>pCur->pBt->nP
2ef80 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
2ef90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2efa0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
2efb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2efc0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2efd0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2efe0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
2eff0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2f000 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
2f010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2f020 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
2f030 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2f040 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2f050 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2f060 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2f070 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f080 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2f090 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2f0a0 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
2f0b0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
2f0c0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
2f0d0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
2f0e0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
2f0f0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2f100 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
2f110 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  fl;.          if
2f120 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2f130 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2f140 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2f150 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2f160 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2f170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f180 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
2f190 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
2f1a0 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2f1b0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2f1c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2f1d0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2f1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2f1f0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2f200 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2f210 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2f220 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2f230 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2f240 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2f250 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2f260 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2f270 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2f280 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2f290 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2f2a0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2f2b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2f2c0 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2f2d0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2f2e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2f2f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2f300 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2f310 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2f320 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2f330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f340 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2f350 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2f360 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2f370 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2f380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2f390 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2f3a0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2f3b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f3c0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2f3d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2f3e0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2f3f0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2f400 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2f410 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2f420 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
2f430 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
2f440 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
2f450 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
2f460 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2f470 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
2f480 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2f490 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2f4a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f4b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2f4c0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
2f4d0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
2f4e0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2f4f0 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
2f500 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
2f510 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f520 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2f530 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
2f540 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
2f550 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
2f560 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2f570 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2f580 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2f590 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f5a0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
2f5b0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2f5c0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2f5d0 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
2f5e0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2f5f0 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  ix = (u16)lwr;. 
2f600 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2f610 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
2f620 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f630 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
2f640 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
2f650 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2f660 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2f670 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2f680 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2f690 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
2f6a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2f6b0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2f6c0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2f6d0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2f6e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2f6f0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2f700 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2f710 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2f720 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2f730 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2f740 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2f750 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2f760 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2f770 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2f780 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2f790 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2f7a0 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2f7b0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2f7c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2f7d0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2f7e0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2f7f0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2f800 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2f810 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2f820 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2f830 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2f840 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2f850 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2f860 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2f870 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2f880 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2f890 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2f8a0 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2f8b0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2f8c0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2f8d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2f8e0 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66  rn an estimate f
2f8f0 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
2f900 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2f910 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  le that pCur is.
2f920 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ** pointing to. 
2f930 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
2f940 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20  ve number if no 
2f950 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72  estimate is curr
2f960 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61  ently .** availa
2f970 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ble..*/.i64 sqli
2f980 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74  te3BtreeRowCount
2f990 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Est(BtCursor *pC
2f9a0 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  ur){.  i64 n;.  
2f9b0 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  u8 i;..  assert(
2f9c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2f9d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2f9e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f9f0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2fa00 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2fa10 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72  x) );..  /* Curr
2fa20 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72  ently this inter
2fa30 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  face is only cal
2fa40 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66  led by the OP_If
2fa50 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63  Smaller.  ** opc
2fa60 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74  ode, and it that
2fa70 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72   case the cursor
2fa80 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2fa90 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77  valid and.  ** w
2faa0 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74  ill always point
2fab0 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e   to a leaf node.
2fac0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2fad0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2fae0 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65  RSOR_VALID) ) re
2faf0 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e  turn -1;.  if( N
2fb00 45 56 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65  EVER(pCur->pPage
2fb10 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74  ->leaf==0) ) ret
2fb20 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70  urn -1;..  n = p
2fb30 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2fb40 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
2fb50 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
2fb60 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72  ){.    n *= pCur
2fb70 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65  ->apPage[i]->nCe
2fb80 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ll;.  }.  return
2fb90 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   n;.}../*.** Adv
2fba0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2fbb0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2fbc0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2fbd0 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  e. .** Return va
2fbe0 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51  lue:.**.**    SQ
2fbf0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73  LITE_OK        s
2fc00 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c  uccess.**    SQL
2fc10 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75  ITE_DONE      cu
2fc20 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2fc30 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
2fc40 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  last element.** 
2fc50 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2fc60 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
2fc70 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
2fc80 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2fc90 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2fca0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2fcb0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2fcc0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2fcd0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2fce0 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2fcf0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2fd00 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2fd10 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2fd20 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2fd30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2fd40 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2fd50 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2fd60 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2fd70 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2fd80 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2fd90 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2fda0 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2fdb0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2fdc0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
2fdd0 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
2fde0 20 46 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73   F argument in s
2fdf0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2fe00 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20  C,F) is 1, then 
2fe10 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f  the.** cursor co
2fe20 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2fe30 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
2fe40 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
2fe50 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
2fe60 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
2fe70 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
2fe80 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2fe90 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a   The F argument.
2fea0 2a 2a 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  ** is a hint to 
2feb0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
2fec0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2fed0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2fee0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73   not use.** this
2fef0 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42   hint, but COMDB
2ff00 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  2 does..*/.stati
2ff10 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2ff20 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2ff30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2ff40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2ff50 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2ff60 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2ff70 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2ff80 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2ff90 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ffa0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ffb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
2ffc0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ffd0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2ffe0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2fff0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
30000 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
30010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
30030 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30040 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
30050 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
30060 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
30070 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
30080 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
30090 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
300a0 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
300b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
300c0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
300d0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
300e0 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 20 72 65  >skipNext>0 ) re
300f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30100 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
30110 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30120 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
30130 2d 3e 69 78 3b 0a 20 20 69 66 28 20 21 70 50 61  ->ix;.  if( !pPa
30140 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
30150 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 6b 6e    /* The only kn
30160 6f 77 6e 20 77 61 79 20 66 6f 72 20 74 68 69 73  own way for this
30170 20 74 6f 20 68 61 70 70 65 6e 20 69 73 20 66 6f   to happen is fo
30180 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 0a  r there to be a.
30190 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
301a0 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68   SQL function th
301b0 61 74 20 64 6f 65 73 20 61 20 44 45 4c 45 54 45  at does a DELETE
301c0 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 70 61   operation as pa
301d0 72 74 20 6f 66 20 61 0a 20 20 20 20 2a 2a 20 53  rt of a.    ** S
301e0 45 4c 45 43 54 20 77 68 69 63 68 20 64 65 6c 65  ELECT which dele
301f0 74 65 73 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  tes content out 
30200 66 72 6f 6d 20 75 6e 64 65 72 20 61 6e 20 61 63  from under an ac
30210 74 69 76 65 20 63 75 72 73 6f 72 0a 20 20 20 20  tive cursor.    
30220 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
30230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
30240 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 62 65  ere the table be
30250 69 6e 67 20 44 45 4c 45 54 45 2d 65 64 20 66 72  ing DELETE-ed fr
30260 6f 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 70 61  om.    ** has pa
30270 67 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  ges in common wi
30280 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
30290 6e 67 20 71 75 65 72 69 65 64 2e 20 20 53 65 65  ng queried.  See
302a0 20 54 48 33 0a 20 20 20 20 2a 2a 20 6d 6f 64 75   TH3.    ** modu
302b0 6c 65 20 63 6f 76 31 2f 62 74 72 65 65 37 38 2e  le cov1/btree78.
302c0 74 65 73 74 20 74 65 73 74 63 61 73 65 20 32 32  test testcase 22
302d0 30 20 28 32 30 31 38 2d 30 36 2d 30 38 29 20 66  0 (2018-06-08) f
302e0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 61  or an.    ** exa
302f0 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74  mple. */.    ret
30300 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
30310 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
30320 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
30330 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
30340 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
30350 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
30360 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
30370 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
30380 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
30390 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
303a0 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
303b0 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
303c0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
303d0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
303e0 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
303f0 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
30400 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
30410 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
30420 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
30430 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
30440 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
30450 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
30460 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
30470 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
30480 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
30490 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
304a0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
304b0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
304c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
304d0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
304e0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
304f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
30500 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
30510 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
30520 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30530 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
30540 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
30550 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
30560 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
30570 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
30580 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
30590 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
305a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
305b0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
305c0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
305d0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
305e0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
305f0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
30600 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e  while( pCur->ix>
30610 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
30620 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
30630 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
30640 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
30650 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29  reeNext(pCur, 0)
30660 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30680 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
30690 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
306a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
306b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
306c0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
306d0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
306e0 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
306f0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
30700 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
30710 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d  nt flags){.  Mem
30720 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55  Page *pPage;.  U
30730 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30740 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
30750 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
30760 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
30770 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  te */.  assert( 
30780 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
30790 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
307a0 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
307b0 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20  | flags==1 );.  
307c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
307d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
307e0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
307f0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
30800 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
30810 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
30820 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
30830 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
30840 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
30850 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
30860 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29  if( (++pCur->ix)
30870 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
30880 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  {.    pCur->ix--
30890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
308a0 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
308b0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
308c0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
308d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
308e0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
308f0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
30900 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
30910 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
30920 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
30930 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
30940 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
30950 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  abase..** Return
30960 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
30970 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
30980 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20   success.**     
30990 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68  SQLITE_DONE   th
309a0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
309b0 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ady on the first
309c0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
309d0 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68  table.**     oth
309e0 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20  erwise     some 
309f0 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63  kind of error oc
30a00 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65  curred.**.** The
30a10 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
30a20 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
30a30 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
30a40 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
30a50 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
30a60 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
30a70 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
30a80 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
30a90 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
30aa0 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
30ab0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
30ac0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
30ad0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
30ae0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
30af0 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
30b00 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
30b10 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
30b20 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
30b30 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
30b40 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
30b50 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
30b60 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
30b70 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74  the F argument t
30b80 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  o sqlite3BtreePr
30b90 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31  evious(C,F) is 1
30ba0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
30bb0 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  rsor corresponds
30bc0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
30bd0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
30be0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
30bf0 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20  n.** skipped if 
30c00 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61  the SQL index ha
30c10 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20  d been a unique 
30c20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72  index.  The F ar
30c30 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68  gument is a.** h
30c40 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
30c50 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76  ment.  The nativ
30c60 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  e SQLite btree i
30c70 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
30c80 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68  es not.** use th
30c90 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d  is hint, but COM
30ca0 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61  DB2 does..*/.sta
30cb0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
30cc0 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
30cd0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
30ce0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
30cf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
30d00 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
30d10 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
30d20 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
30d30 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30d40 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
30d50 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
30d60 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
30d70 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
30d80 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
30d90 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
30da0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
30db0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
30dc0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
30dd0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
30de0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
30df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30e00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30e10 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
30e20 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
30e30 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
30e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30e50 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
30e60 69 66 28 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  if( CURSOR_SKIPN
30e70 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  EXT==pCur->eStat
30e80 65 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  e ){.      pCur-
30e90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
30ea0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
30eb0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
30ec0 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
30ed0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
30ee0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
30ef0 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
30f00 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
30f10 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
30f20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
30f30 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78  t idx = pCur->ix
30f40 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
30f50 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
30f60 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
30f70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
30f80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30f90 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
30fa0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
30fb0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
30fc0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
30fd0 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ix==0 ){.      i
30fe0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
30ff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
31000 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
31010 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
31020 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31030 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
31040 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
31050 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
31060 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
31070 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
31080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
31090 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
310a0 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   (BTCF_ValidOvfl
310b0 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
310c0 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50  ur->ix--;.    pP
310d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
310e0 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
310f0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
31100 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
31110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31120 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
31130 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
31140 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31150 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
31160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31170 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
31180 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
31190 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
311a0 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  gs){.  assert( c
311b0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
311c0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
311d0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
311e0 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 55   flags==1 );.  U
311f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31200 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
31210 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
31220 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
31230 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
31240 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
31250 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
31260 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
31270 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
31280 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
31290 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
312a0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
312b0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
312c0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70  =0.   || pCur->p
312d0 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  Page->leaf==0.  
312e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
312f0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
31300 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  );.  }.  pCur->i
31310 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x--;.  return SQ
31320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
31330 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
31340 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
31350 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
31360 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
31370 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
31380 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
31390 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
313a0 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
313b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
313c0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
313d0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
313e0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
313f0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
31400 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
31410 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
31420 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
31430 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
31440 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
31450 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
31460 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
31470 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
31480 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
31490 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
314a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
314b0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
314c0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
314d0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
314e0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
314f0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
31500 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
31510 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
31520 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
31530 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
31540 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
31550 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
31560 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
31570 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
31580 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
31590 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
315a0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
315b0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
315c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
315d0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
315e0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
315f0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
31600 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
31610 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
31620 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
31630 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
31640 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
31650 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
31660 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
31670 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
31680 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
31690 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
316a0 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
316b0 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
316c0 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
316d0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
316e0 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
316f0 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
31700 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
31710 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
31720 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
31730 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
31740 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
31750 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
31760 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
31770 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
31780 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
31790 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
317a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
317b0 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
317c0 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
317d0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
317e0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
317f0 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
31800 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
31810 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
31820 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
31830 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
31840 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
31850 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
31860 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31880 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
31890 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
318a0 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
318b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
318c0 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
318d0 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
318e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
318f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
31900 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
31910 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
31920 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
31930 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
31940 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
31950 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
31960 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
31970 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
31980 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
31990 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
319a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
319b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
319c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
319d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
319e0 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
319f0 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
31a00 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74  y>0 && IfNotOmit
31a10 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  AV(pBt->autoVacu
31a20 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31  um)) );.  pPage1
31a30 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
31a40 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65    mxPage = btree
31a50 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
31a60 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
31a70 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20  : R-05119-02637 
31a80 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
31a90 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
31aa0 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20   offset 36.  ** 
31ab0 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68  stores stores th
31ac0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
31ad0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
31ae0 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20  reelist. */.  n 
31af0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
31b00 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
31b10 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
31b20 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
31b30 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
31b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31b50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31b60 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
31b70 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
31b80 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
31b90 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
31ba0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
31bb0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
31bc0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
31bd0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
31be0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
31bf0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
31c00 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
31c10 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63  /.    u32 nSearc
31c20 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e  h = 0;   /* Coun
31c30 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
31c40 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70  of search attemp
31c50 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  ts */.    .    /
31c60 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  * If eMode==BTAL
31c70 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20  LOC_EXACT and a 
31c80 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
31c90 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
31ca0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
31cb0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
31cc0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
31cd0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
31ce0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
31cf0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
31d00 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
31d10 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
31d20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31d30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31d40 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
31d50 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20  LLOC_EXACT ){.  
31d60 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d      if( nearby<=
31d70 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
31d80 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
31d90 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
31da0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  by>0 );.        
31db0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
31dc0 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
31dd0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
31de0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
31df0 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
31e00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
31e10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
31e20 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
31e30 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
31e40 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
31e50 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
31e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
31e70 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54  se if( eMode==BT
31e80 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
31e90 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
31ea0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
31eb0 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
31ec0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
31ed0 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
31ee0 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
31ef0 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
31f00 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
31f10 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
31f20 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
31f30 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
31f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31f50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
31f60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31f70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31f80 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
31f90 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31fa0 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
31fb0 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
31fc0 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
31fd0 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
31fe0 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
31ff0 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
32000 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
32010 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
32020 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
32030 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
32040 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
32050 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
32060 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
32070 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
32080 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20  ALLOC_EXACT).   
32090 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70   ** or until a p
320a0 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e  age less than 'n
320b0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
320c0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
320d0 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20  C_LT).    */.   
320e0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
320f0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
32100 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
32110 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
32120 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
32130 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54   R-01506-11053 T
32140 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
32150 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
32160 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
32170 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65    ** is the page
32180 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
32190 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ext freelist tru
321a0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  nk page in the l
321b0 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ist or.        *
321c0 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69  * zero if this i
321d0 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c  s the last freel
321e0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
321f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
32200 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
32210 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
32220 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
32230 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
32240 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34  DENCE-OF: R-5984
32250 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79  1-13798 The 4-by
32260 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
32270 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
32280 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  32.        ** st
32290 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75  ores the page nu
322a0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
322b0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72  t page of the fr
322c0 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20  eelist, or zero 
322d0 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  if.        ** th
322e0 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
322f0 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  pty. */.        
32300 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
32310 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
32320 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
32330 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
32340 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
32350 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
32360 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61  k>mxPage || nSea
32370 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20  rch++ > n ){.   
32380 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32390 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
323a0 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76  revTrunk ? pPrev
323b0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29  Trunk->pgno : 1)
323c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
323d0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
323e0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
323f0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
32400 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
32410 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
32420 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
32430 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
32440 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32450 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
32460 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
32470 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
32480 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
32490 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
324a0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
324b0 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
324c0 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
324d0 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
324e0 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
324f0 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
32500 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
32510 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
32520 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
32530 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
32540 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
32550 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
32560 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
32570 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
32580 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
32590 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
325a0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
325b0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
325c0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
325d0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
325e0 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
325f0 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
32600 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
32610 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
32620 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
32630 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
32640 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32650 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
32660 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32670 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32680 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32690 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
326a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
326b0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
326c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
326d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
326e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
326f0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
32700 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
32710 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
32720 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
32730 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32740 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
32750 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
32760 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
32770 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
32780 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
32790 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
327a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
327b0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
327c0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
327d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
327e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
327f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32800 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
32810 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32820 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
32830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32840 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32850 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
32860 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
32870 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
32880 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
32890 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
328a0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
328b0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
328c0 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
328d0 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
328e0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
328f0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
32900 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
32910 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
32920 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
32930 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
32940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32950 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
32960 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
32970 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
32980 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
32990 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
329a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
329b0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
329c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
329d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
329e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
329f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32a00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
32a10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
32a20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
32a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32a40 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
32a50 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
32a60 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
32a70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
32a80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
32a90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32aa0 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
32ab0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32ac0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32ae0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32af0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32b00 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
32b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
32b20 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
32b30 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
32b40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
32b50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
32b80 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
32b90 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
32ba0 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
32bb0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
32bc0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
32bd0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
32be0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
32bf0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
32c00 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
32c10 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
32c20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32c30 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
32c40 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
32c50 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
32c60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
32c70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
32c80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
32c90 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
32ca0 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
32cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32cc0 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
32cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
32ce0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32cf0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
32d00 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
32d10 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
32d20 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32d30 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
32d40 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
32d50 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
32d60 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
32d70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32d90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32da0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32db0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32dc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32dd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
32de0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
32df0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
32e20 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
32e30 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
32e40 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32e50 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32e60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
32e70 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
32e80 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
32e90 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
32ea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
32eb0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
32ec0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
32ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
32ee0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
32ef0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
32f00 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
32f10 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
32f20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
32f30 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
32f40 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
32f50 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
32f60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32f70 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32f80 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
32f90 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
32fa0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
32fb0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
32fc0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
32fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32fe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33000 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
33010 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
33020 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
33030 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
33040 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
33050 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33060 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
33070 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
33080 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
33090 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
330a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
330b0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
330c0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
330d0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
330e0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
330f0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
33100 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
33110 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
33120 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
33130 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
33140 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
33150 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
33160 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
33170 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
33180 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
33190 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
331a0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
331b0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
331c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
331d0 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
331e0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
331f0 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
33200 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
33210 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
33220 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
33230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
33240 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
33250 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
33260 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
33270 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
33280 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33290 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
332a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
332b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
332c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
332d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
332e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
332f0 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
33300 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
33310 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
33320 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
33330 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
33340 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
33350 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
33360 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
33370 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
33380 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
33390 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
333a0 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
333b0 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
333c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
333d0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
333e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
333f0 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
33400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
33430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
33440 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
33450 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
33460 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
33470 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
33480 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
33490 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
334a0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
334b0 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
334c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
334d0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
334e0 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
334f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
33500 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
33510 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
33520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
33530 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
33540 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
33550 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
33560 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
33570 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
33580 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
33590 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
335a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
335b0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
335c0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
335d0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
335e0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
335f0 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
33600 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
33610 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
33620 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
33630 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
33640 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
33650 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
33660 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
33670 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
33680 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
33690 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
336a0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
336b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
336c0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
336d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
336e0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
336f0 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
33700 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
33710 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
33720 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
33730 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
33740 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
33750 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
33760 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
33770 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
33780 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
33790 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
337a0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
337b0 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
337c0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
337d0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
337e0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
337f0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
33800 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33820 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33830 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
33840 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
33850 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
33860 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33870 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33880 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
33890 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
338a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
338b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
338c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
338d0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
338e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
338f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
33900 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
33910 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
33920 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
33930 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
33940 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
33950 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
33960 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
33970 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
33980 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
33990 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
339a0 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
339b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
339c0 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
339d0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
339e0 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
339f0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
33a00 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
33a10 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
33a20 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
33a30 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
33a40 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
33a50 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
33a60 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
33a70 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
33a80 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
33a90 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
33aa0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
33ab0 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
33ac0 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
33ad0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
33ae0 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
33af0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
33b00 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
33b10 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
33b20 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
33b30 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
33b40 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
33b50 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
33b60 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
33b70 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
33b80 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
33b90 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
33ba0 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
33bb0 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
33bc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
33bd0 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
33be0 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
33bf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
33c00 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
33c10 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
33c20 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
33c30 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
33c40 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
33c50 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
33c60 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
33c70 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
33c80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
33c90 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
33ca0 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
33cb0 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
33cc0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
33cd0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
33ce0 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
33cf0 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
33d00 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
33d10 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
33d20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
33d30 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
33d40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
33d50 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
33d60 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
33d70 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
33d80 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
33d90 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
33da0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
33db0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
33dc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33dd0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
33de0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
33df0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33e00 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
33e10 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
33e20 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
33e30 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
33e40 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
33e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33e60 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
33e70 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
33e80 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
33e90 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
33ea0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
33eb0 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
33ec0 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
33ed0 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
33ee0 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
33ef0 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
33f00 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
33f10 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
33f20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
33f30 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
33f40 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
33f50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
33f60 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
33f70 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
33f80 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
33f90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
33fa0 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
33fb0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
33fc0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
33fd0 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
33fe0 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
33ff0 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
34000 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
34010 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
34020 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
34030 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
34040 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
34050 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
34060 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
34070 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34080 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
34090 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
340a0 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
340b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
340c0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
340d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
340e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
340f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
34100 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
34110 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
34120 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
34130 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
34140 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
34150 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
34160 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
34170 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
34180 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
34190 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
341a0 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
341b0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
341c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
341d0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
341e0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
341f0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
34200 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
34210 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
34220 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
34230 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34240 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
34250 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
34260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34270 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
34280 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
34290 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
342a0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
342b0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
342c0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
342d0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
342e0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  }..  assert( COR
342f0 52 55 50 54 5f 44 42 20 7c 7c 20 2a 70 50 67 6e  RUPT_DB || *pPgn
34300 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
34310 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
34320 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
34330 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
34340 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
34350 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
34360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
34370 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
34380 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
34390 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
343a0 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b  ->pDbPage)<=1 );
343b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
343c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70  QLITE_OK || (*pp
343d0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
343e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
343f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
34400 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
34410 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
34420 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
34430 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
34440 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
34450 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
34460 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
34470 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
34480 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
34490 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
344a0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
344b0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
344c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
344d0 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
344e0 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
344f0 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
34500 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
34510 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
34520 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
34530 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
34540 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
34550 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
34560 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
34570 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
34580 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
34590 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
345a0 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
345b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
345c0 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
345d0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
345e0 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
345f0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
34600 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
34610 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
34620 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
34630 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
34640 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
34650 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
34660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34670 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
34680 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
34690 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
346a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346b0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
346c0 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
346d0 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
346e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
346f0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
34700 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
34710 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
34720 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
34730 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
34740 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34750 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
34760 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
34770 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
34780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34790 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
347a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
347b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
347c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
347d0 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
347e0 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
347f0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
34800 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34810 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
34820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
34830 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67  RRUPT_DB || iPag
34840 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
34850 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
34860 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
34870 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50  age );..  if( iP
34880 61 67 65 3c 32 20 7c 7c 20 69 50 61 67 65 3e 70  age<2 || iPage>p
34890 42 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  Bt->nPage ){.   
348a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
348b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
348c0 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
348d0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
348e0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
348f0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
34900 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
34910 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
34920 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
34930 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
34940 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
34950 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
34960 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
34970 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
34980 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34990 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
349a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
349b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
349c0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
349d0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
349e0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
349f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34a00 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
34a10 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
34a20 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
34a30 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
34a40 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
34a50 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
34a60 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
34a70 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
34a80 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
34a90 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
34aa0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
34ab0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
34ac0 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
34ad0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
34ae0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
34af0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
34b00 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
34b10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34b20 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
34b30 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
34b40 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34b50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34b60 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
34b70 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
34b80 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
34b90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
34ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34bb0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34bc0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
34bd0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
34be0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
34bf0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
34c00 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
34c10 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
34c20 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
34c30 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
34c40 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
34c50 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
34c60 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
34c70 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
34c80 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
34c90 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
34ca0 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
34cb0 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
34cc0 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
34cd0 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
34ce0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
34cf0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
34d00 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
34d10 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
34d20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
34d30 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
34d40 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
34d50 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
34d60 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
34d70 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
34d80 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
34d90 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
34da0 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
34db0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
34dc0 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
34dd0 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
34de0 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
34df0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
34e00 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
34e10 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
34e20 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
34e30 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
34e40 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
34e50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
34e60 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
34e70 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
34e80 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
34e90 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
34ea0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34eb0 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
34ec0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
34ed0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
34ee0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
34ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34f00 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
34f10 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
34f20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
34f30 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
34f40 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
34f50 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
34f60 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
34f70 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
34f80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
34f90 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
34fa0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34fb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
34fc0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34fd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
34fe0 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
34ff0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
35000 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
35010 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
35020 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
35030 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
35040 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
35050 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
35060 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
35070 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
35080 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
35090 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
350a0 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
350b0 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
350c0 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
350d0 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
350e0 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
350f0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
35100 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
35110 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
35120 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
35130 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
35140 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
35150 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
35160 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
35170 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
35180 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
35190 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
351a0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
351b0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
351c0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
351d0 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
351e0 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
351f0 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
35200 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
35210 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
35220 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
35230 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
35240 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
35250 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
35260 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
35270 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
35280 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
35290 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
352a0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
352b0 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
352c0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
352d0 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
352e0 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
352f0 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
35300 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
35310 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
35320 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
35330 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
35340 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
35350 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
35360 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
35370 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
35380 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
35390 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
353a0 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
353b0 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
353c0 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
353d0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
353e0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
353f0 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
35400 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
35410 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
35420 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
35430 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
35440 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
35450 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
35460 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
35470 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
35480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35490 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
354a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
354b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
354c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
354d0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
354e0 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
354f0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
35500 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
35510 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
35520 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
35530 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
35540 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35550 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
35560 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
35570 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
35580 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
35590 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
355a0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
355b0 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
355c0 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
355d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
355e0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
355f0 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
35600 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
35610 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
35620 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
35630 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
35640 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
35650 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
35660 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
35670 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
35680 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
35690 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
356a0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
356b0 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
356c0 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
356d0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
356e0 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
356f0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
35700 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
35710 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
35720 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
35730 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
35740 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
35750 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
35760 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
35770 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
35780 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
35790 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
357a0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
357b0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
357c0 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
357d0 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
357e0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
357f0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
35800 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
35810 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
35820 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35830 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
35840 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
35850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35860 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
35870 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
35880 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
35890 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
358a0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
358b0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
358c0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
358d0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
358e0 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
358f0 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
35900 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
35910 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
35920 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
35930 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
35940 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
35950 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
35960 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
35970 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
35980 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
35990 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
359a0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
359b0 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
359c0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
359d0 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
359e0 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
359f0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
35a00 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
35a10 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
35a20 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
35a30 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
35a40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
35a50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
35a60 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53  e given Cell.  S
35a70 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66  tore.** size inf
35a80 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
35a90 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f  he cell in pInfo
35aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35ab0 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
35ac0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
35ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
35ae0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
35af0 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
35b00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
35b10 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
35b20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
35b30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
35b40 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f  pInfo          /
35b50 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * Size informati
35b60 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
35b70 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  l */.){.  BtShar
35b80 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ed *pBt;.  Pgno 
35b90 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
35ba0 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
35bb0 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
35bc0 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
35bd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35be0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35bf0 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
35c00 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
35c10 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
35c20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  );.  if( pInfo->
35c30 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e  nLocal==pInfo->n
35c40 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
35c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35c60 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
35c70 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
35c80 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
35c90 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74  thing */.  }.  t
35ca0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b  estcase( pCell +
35cb0 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d   pInfo->nSize ==
35cc0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
35cd0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
35ce0 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  pCell + (pInfo->
35cf0 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67  nSize-1) == pPag
35d00 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
35d10 20 69 66 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e   if( pCell + pIn
35d20 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67  fo->nSize > pPag
35d30 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20  e->aDataEnd ){. 
35d40 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e     /* Cell exten
35d50 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
35d60 61 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  age */.    retur
35d70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
35d80 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
35d90 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
35da0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20  et4byte(pCell + 
35db0 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34  pInfo->nSize - 4
35dc0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
35dd0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
35de0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
35df0 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
35e00 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
35e10 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
35e20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e  nOvfl = (pInfo->
35e30 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f  nPayload - pInfo
35e40 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  ->nLocal + ovflP
35e50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
35e60 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
35e70 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
35e80 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
35e90 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79   && (pInfo->nPay
35ea0 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53  load + ovflPageS
35eb0 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a  ize)<ovflPageSiz
35ec0 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  e).  );.  while(
35ed0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
35ee0 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
35ef0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
35f00 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
35f10 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
35f20 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
35f30 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
35f40 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
35f50 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
35f60 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
35f70 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
35f80 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
35f90 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
35fa0 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
35fb0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
35fc0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
35fd0 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
35fe0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
35ff0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
36000 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36010 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
36020 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
36030 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
36040 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
36050 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
36060 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
36070 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36080 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
36090 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
360a0 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
360b0 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
360c0 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
360d0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
360e0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
360f0 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
36100 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
36110 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
36120 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
36130 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
36140 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
36150 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
36160 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
36170 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
36180 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
36190 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
361a0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
361b0 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
361c0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
361d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
361e0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
361f0 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
36200 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
36210 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
36220 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
36230 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
36240 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
36250 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
36260 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
36270 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
36280 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
36290 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
362a0 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
362b0 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
362c0 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
362d0 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
362e0 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
362f0 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
36300 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
36310 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
36320 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
36330 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
36340 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
36350 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
36360 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
36370 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
36380 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
36390 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
363a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
363b0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
363c0 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
363d0 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
363e0 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
363f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
36400 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
36410 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
36420 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36430 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
36440 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
36450 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
36460 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
36470 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
36480 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
36490 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
364a0 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
364b0 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
364c0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
364d0 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
364e0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
364f0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
36500 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
36510 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
36520 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
36530 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
36540 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
36550 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
36560 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
36570 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
36580 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
36590 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
365a0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
365b0 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
365c0 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
365d0 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
365e0 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
365f0 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
36600 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
36610 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
36620 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
36630 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
36640 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
36650 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
36660 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
36670 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
36680 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
36690 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
366a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
366b0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
366c0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
366d0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
366e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
366f0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
36700 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
36710 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20  st BtreePayload 
36720 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  *pX,        /* P
36730 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63  ayload with whic
36740 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  h to construct t
36750 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
36760 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
36770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
36780 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
36790 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
367a0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
367b0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
367c0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d  t nSrc, n, rc, m
367d0 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  n;.  int spaceLe
367e0 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
367f0 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73  ToRelease;.  uns
36800 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
36810 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
36820 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
36830 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
36840 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b    Pgno pgnoOvfl;
36850 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
36860 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36870 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
36880 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
36890 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
368a0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
368b0 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
368c0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
368d0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
368e0 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
368f0 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
36900 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
36910 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
36920 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
36930 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
36940 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
36950 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  a[pPage->pBt->pa
36960 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
36970 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
36980 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36990 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
369a0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
369b0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
369c0 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
369d0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
369e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
369f0 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c  Key ){.    nPayl
36a00 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20  oad = pX->nData 
36a10 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20  + pX->nZero;.   
36a20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74   pSrc = pX->pDat
36a30 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58  a;.    nSrc = pX
36a40 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->nData;.    ass
36a50 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
36a60 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c  eyLeaf ); /* fil
36a70 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63  lInCell() only c
36a80 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73  alled for leaves
36a90 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20   */.    nHeader 
36aa0 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
36ab0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
36ac0 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e  nPayload);.    n
36ad0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
36ae0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
36af0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d  er], *(u64*)&pX-
36b00 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
36b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
36b20 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66  >nKey<=0x7ffffff
36b30 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30  f && pX->pKey!=0
36b40 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e   );.    nSrc = n
36b50 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70  Payload = (int)p
36b60 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  X->nKey;.    pSr
36b70 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20  c = pX->pKey;.  
36b80 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
36b90 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
36ba0 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
36bb0 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ad);.  }.  .  /*
36bc0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
36bd0 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f  load */.  pPaylo
36be0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
36bf0 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79  der];.  if( nPay
36c00 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
36c10 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
36c20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d  This is the comm
36c30 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 65 76  on case where ev
36c40 65 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e  erything fits on
36c50 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 0a   the btree page.
36c60 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76      ** and no ov
36c70 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
36c80 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
36c90 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20    n = nHeader + 
36ca0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65  nPayload;.    te
36cb0 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a  stcase( n==3 );.
36cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
36cd0 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  =4 );.    if( n<
36ce0 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a  4 ) n = 4;.    *
36cf0 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  pnSize = n;.    
36d00 61 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50  assert( nSrc<=nP
36d10 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65  ayload );.    te
36d20 73 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61  stcase( nSrc<nPa
36d30 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d  yload );.    mem
36d40 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
36d50 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d  rc, nSrc);.    m
36d60 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e  emset(pPayload+n
36d70 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64  Src, 0, nPayload
36d80 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75  -nSrc);.    retu
36d90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
36da0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
36db0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
36dc0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  it means that so
36dd0 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  me of the conten
36de0 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a  t will need.  **
36df0 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f   to spill onto o
36e00 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
36e10 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65   */.  mn = pPage
36e20 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20  ->minLocal;.  n 
36e30 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64  = mn + (nPayload
36e40 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d   - mn) % (pPage-
36e50 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36e60 20 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73   - 4);.  testcas
36e70 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
36e80 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
36e90 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
36ea0 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
36eb0 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
36ec0 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
36ed0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e  .  spaceLeft = n
36ee0 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20  ;.  *pnSize = n 
36ef0 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
36f00 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
36f10 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70  [nHeader+n];.  p
36f20 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
36f30 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
36f40 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
36f50 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  t;..  /* At this
36f60 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
36f70 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
36f80 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
36f90 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
36fa0 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
36fb0 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
36fc0 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
36fd0 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
36fe0 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
36ff0 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
37000 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
37010 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
37020 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
37030 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
37040 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
37050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37060 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
37070 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
37080 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
37090 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
370a0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
370b0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
370c0 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
370d0 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
370e0 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
370f0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
37100 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
37110 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
37120 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
37130 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
37140 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
37150 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
37160 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
37170 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
37180 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
37190 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
371a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
371b0 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
371c0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
371d0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
371e0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
371f0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
37200 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69  ert( nHeader==(i
37210 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
37220 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
37230 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
37240 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b  Key==pX->nKey );
37250 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e  .    assert( *pn
37260 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69  Size == info.nSi
37270 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
37280 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69  ( spaceLeft == i
37290 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20  nfo.nLocal );.  
372a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  }.#endif..  /* W
372b0 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64  rite the payload
372c0 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
372d0 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74  Cell and any ext
372e0 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ra into overflow
372f0 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c   pages */.  whil
37300 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e( 1 ){.    n = 
37310 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
37320 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
37330 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
37340 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
37350 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
37360 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
37370 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
37380 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
37390 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
373a0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
373b0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
373c0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
373d0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
373e0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
373f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37400 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
37410 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
37420 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
37430 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
37440 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
37450 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
37460 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
37470 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
37480 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
37490 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
374a0 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
374b0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
374c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
374d0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
374e0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
374f0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
37500 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
37510 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20   nSrc>=n ){.    
37520 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
37530 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
37540 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e   }else if( nSrc>
37550 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e  0 ){.      n = n
37560 53 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  Src;.      memcp
37570 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
37580 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
37590 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
375a0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
375b0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
375c0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  d -= n;.    if( 
375d0 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72  nPayload<=0 ) br
375e0 65 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  eak;.    pPayloa
375f0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
37600 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
37610 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
37620 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
37630 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
37640 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
37650 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e  *pOvfl = 0;.#ifn
37660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37670 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
37680 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
37690 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
376a0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
376b0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
376c0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
376d0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
376e0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
376f0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
37700 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
37710 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
37720 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
37730 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
37740 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
37750 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
37760 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
37770 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
37780 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
37790 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
377a0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
377b0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
377c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
377d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
377e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
377f0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
37800 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
37810 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
37820 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
37830 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
37840 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
37850 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
37860 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
37870 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
37880 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
37890 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
378a0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
378b0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
378c0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
378d0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
378e0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
378f0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
37900 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
37910 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
37920 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
37930 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
37940 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
37950 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
37960 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
37970 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
37980 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
37990 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
379a0 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
379b0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
379c0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
379d0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
379e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
379f0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
37a00 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
37a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37a20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
37a30 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
37a40 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
37a50 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
37a60 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
37a70 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
37a80 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
37a90 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
37aa0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
37ab0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
37ac0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
37ad0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
37ae0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
37af0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
37b00 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
37b10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37b20 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
37b30 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
37b40 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
37b50 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
37b60 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
37b70 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
37b80 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
37b90 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
37ba0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
37bb0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
37bc0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
37bd0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
37be0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37bf0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
37c00 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
37c10 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
37c20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
37c30 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
37c40 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
37c50 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
37c60 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37c70 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
37c80 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
37c90 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
37ca0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
37cb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
37cc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
37cd0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37ce0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
37cf0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
37d00 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
37d10 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
37d20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
37d30 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
37d40 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
37d50 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
37d60 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
37d70 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
37d80 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
37d90 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
37da0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
37db0 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
37dc0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
37dd0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   - 4;.    }.  }.
37de0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
37df0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
37e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37e10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
37e20 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
37e30 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
37e40 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
37e50 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
37e60 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
37e70 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
37e80 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
37e90 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
37ea0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
37eb0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
37ec0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
37ed0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
37ee0 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
37ef0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
37f00 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
37f10 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
37f20 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
37f30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
37f40 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
37f50 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
37f60 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
37f70 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
37f80 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
37f90 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
37fa0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
37fb0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
37fc0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
37fd0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
37fe0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
37ff0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
38000 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
38010 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
38020 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
38030 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
38040 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
38050 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
38060 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
38070 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
38080 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
38090 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
380a0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
380b0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
380c0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rn;.  assert( id
380d0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
380e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
380f0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
38100 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
38110 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
38120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
38130 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
38140 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
38150 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
38160 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
38170 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
38180 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
38190 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
381a0 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
381b0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
381c0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
381d0 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
381e0 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
381f0 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
38200 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
38210 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
38220 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
38230 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
38240 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
38250 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
38260 20 29 3b 0a 20 20 69 66 28 20 70 63 2b 73 7a 20   );.  if( pc+sz 
38270 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
38280 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
38290 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
382a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
382b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
382c0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
382d0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
382e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
382f0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
38300 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
38310 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
38320 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
38330 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
38340 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
38350 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
38360 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
38370 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
38380 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
38390 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
383a0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
383b0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
383c0 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
383d0 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
383e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383f0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
38400 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
38410 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
38420 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
38430 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
38440 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
38450 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
38460 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
38470 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
38480 2b