/ Hex Artifact Content
Login

Artifact e642eb712464ec89d9fe736faac6c10504c75a206555a4ea52ddfc084d2fc2b9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51  }.}.#else  /* SQ
5440: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
5450: 52 45 4e 54 20 2a 2f 0a 23 20 64 65 66 69 6e 65  RENT */.# define
5460: 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
5470: 63 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f  cate(x) SQLITE_O
5480: 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  K.# define btree
5490: 50 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20  PtrmapDelete(x) 
54a0: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
54b0: 74 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20  trmapBegin(x,y) 
54c0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
54d0: 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45  ine btreePtrmapE
54e0: 6e 64 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  nd(x,y,z) .#endi
54f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5500: 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a  _CONCURRENT */..
5510: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
5520: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
5530: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
5540: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
5550: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
5560: 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d  leasePageOne(Mem
5570: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
5580: 20 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65     /* Forward re
5590: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
55a0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
55b0: 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
55c0: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
55d0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
55e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68   */../*.***** Th
55f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5600: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
5610: 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a  ert() only ****.
5620: 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  **.** Verify tha
5630: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
5640: 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ds the mutex on 
5650: 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  its BtShared.*/.
5660: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5670: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
5680: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5690: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
56a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
56b0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
56c0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20  ->mutex);.}../* 
56d0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
56e0: 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65 20 42  cursor and the B
56f0: 74 53 68 61 72 65 64 20 61 67 72 65 65 20 61 62  tShared agree ab
5700: 6f 75 74 20 77 68 61 74 20 69 73 20 74 68 65 20  out what is the 
5710: 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  current.** datab
5720: 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54  ase connetion. T
5730: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
5740: 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63 68 65   in shared-cache
5750: 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 64 61   mode. If the da
5760: 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65  tabase .** conne
5770: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67  ction pointers g
5780: 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20  et out-of-sync, 
5790: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
57a0: 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65  or routines like
57b0: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
57c0: 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e 63 65  e() to reference
57d0: 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63   an stale connec
57e0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61  tion pointer tha
57f0: 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 0a 2a  t references a.*
5800: 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  * a connection t
5810: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
5820: 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20 72 6f  closed.  This ro
5830: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
5840: 73 69 64 65 20 61 73 73 65 72 74 28 29 0a 2a 2a  side assert().**
5850: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79   statements only
5860: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 75 72   and for the pur
5870: 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63  pose of double-c
5880: 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74 68 65  hecking that the
5890: 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64   btree code.** d
58a0: 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64 61 74  oes keep the dat
58b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
58c0: 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d   pointers up-to-
58d0: 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  date..*/.static 
58e0: 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  int cursorOwnsBt
58f0: 53 68 61 72 65 64 28 42 74 43 75 72 73 6f 72 20  Shared(BtCursor 
5900: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  *p){.  assert( c
5910: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5920: 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  p) );.  return (
5930: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  p->pBtree->db==p
5940: 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65  ->pBt->db);.}.#e
5950: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  ndif../*.** Inva
5960: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
5970: 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74 68 65  low cache of the
5980: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
5990: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
59a0: 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20  ment..** on the 
59b0: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
59c0: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23  ucture pBt..*/.#
59d0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
59e0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
59f0: 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46  Cur) (pCur->curF
5a00: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
5a10: 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20  lidOvfl)../*.** 
5a20: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5a30: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
5a40: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
5a50: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
5a60: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
5a70: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
5a80: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
5a90: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
5aa0: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
5ab0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
5ac0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5ad0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5ae0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5af0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
5b00: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
5b10: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5b20: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
5b30: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a  erflowCache(p);.
5b40: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
5b60: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  LOB./*.** This f
5b70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
5b80: 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  d before modifyi
5b90: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
5ba0: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f  of a table.** to
5bb0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
5bc0: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
5bd0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5be0: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
5bf0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
5c00: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
5c10: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
5c20: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
5c30: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
5c40: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
5c50: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
5c60: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
5c70: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
5c80: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
5c90: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
5ca0: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
5cb0: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
5cc0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
5cd0: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
5ce0: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
5cf0: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
5d00: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
5d10: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
5d20: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
5d30: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
5d40: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
5d50: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
5d60: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
5d70: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
5d80: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
5d90: 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69   on that specifi
5da0: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
5db0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
5dc0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
5dd0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
5de0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
5df0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
5e00: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
5e10: 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e30: 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  le that might be
5e40: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
5e50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
5e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
5e70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
5e80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
5e90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
5ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5eb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
5ec0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
5ed0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
5ee0: 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d  p;.  if( pBtree-
5ef0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d  >hasIncrblobCur=
5f00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
5f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
5f20: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
5f30: 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65  tree) );.  pBtre
5f40: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
5f50: 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  r = 0;.  for(p=p
5f60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
5f70: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5f80: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  xt){.    if( (p-
5f90: 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
5fa0: 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b  _Incrblob)!=0 ){
5fb0: 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68  .      pBtree->h
5fc0: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
5fd0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  1;.      if( p->
5fe0: 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f  pgnoRoot==pgnoRo
5ff0: 6f 74 20 26 26 20 28 69 73 43 6c 65 61 72 54 61  ot && (isClearTa
6000: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
6010: 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20  Key==iRow) ){.  
6020: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
6030: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6050: 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f    }.}..#else.  /
6060: 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20  * Stub function 
6070: 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73  when INCRBLOB is
6080: 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64   omitted */.  #d
6090: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
60a0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
60b0: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
60c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
60d0: 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
60e0: 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f  * Set bit pgno o
60f0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  f the BtShared.p
6100: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
6110: 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  c. This is calle
6120: 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67  d .** when a pag
6130: 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c  e that previousl
6140: 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61  y contained data
6150: 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
6160: 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61  list leaf .** pa
6170: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74  ge..**.** The Bt
6180: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
6190: 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73  nt bitvec exists
61a0: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
61b0: 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75  an obscure.** bu
61c0: 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20  g caused by the 
61d0: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74  interaction of t
61e0: 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74  wo useful IO opt
61f0: 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f  imizations surro
6200: 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c  unding.** free-l
6210: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a  ist leaf pages:.
6220: 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
6230: 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  all data is dele
6240: 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20  ted from a page 
6250: 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63  and the page bec
6260: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66  omes.**      a f
6270: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
6280: 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20  ge, the page is 
6290: 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
62b0: 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73      (as free-lis
62c0: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e  t leaf pages con
62d0: 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66  tain no meaningf
62e0: 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69  ul data). Someti
62f0: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68  mes.**      such
6300: 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65   a page is not e
6310: 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28  ven journalled (
6320: 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
6330: 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20  e modified,.**  
6340: 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a      why bother j
6350: 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e  ournalling it?).
6360: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
6370: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6380: 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64  f page is reused
6390: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73  , its content is
63a0: 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20   not read.**    
63b0: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62    from the datab
63c0: 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74  ase or written t
63d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
63e0: 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69  le (why should i
63f0: 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66  t.**      be, if
6400: 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c   it is not at al
6410: 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a  l meaningful?)..
6420: 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c  **.** By themsel
6430: 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d  ves, these optim
6440: 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69  izations work fi
6450: 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61  ne and provide a
6460: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
6470: 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62  mance boost to b
6480: 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e  ulk delete or in
6490: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  sert operations.
64a0: 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20   However, if.** 
64b0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
64c0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
64d0: 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64   and then reused
64e0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
64f0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  .** transaction,
6500: 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73   a problem comes
6510: 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65   up. If the page
6520: 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c   is not journall
6530: 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73  ed when.** it is
6540: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
6550: 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69  ee-list and it i
6560: 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e  s also not journ
6570: 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a  alled when it.**
6580: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
6590: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
65a0: 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65   and reused, the
65b0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  n the original d
65c0: 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f  ata.** may be lo
65d0: 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74  st. In the event
65e0: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20   of a rollback, 
65f0: 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  it may not be po
6600: 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73  ssible.** to res
6610: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
6620: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
6630: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l configuration.
6640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74  .**.** The solut
6650: 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61  ion is the BtSha
6660: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
6670: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
6680: 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d   a page is .** m
6690: 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  oved to become a
66a0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
66b0: 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73  page, the corres
66c0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a  ponding bit is.*
66d0: 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74  * set in the bit
66e0: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
66f0: 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74  leaf page is ext
6700: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
6710: 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70  free-list,.** op
6720: 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f  timization 2 abo
6730: 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  ve is omitted if
6740: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
6750: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
6760: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
6770: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
6780: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
6790: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
67a0: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
67b0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
67c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
67d0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
67e0: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
67f0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
6800: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
6810: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6820: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
6830: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  ontent ){.    as
6840: 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d  sert( pgno<=pBt-
6850: 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42  >nPage );.    pB
6860: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
6870: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
6880: 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29  eate(pBt->nPage)
6890: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
68a0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
68b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
68c0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
68d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
68e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
68f0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
6900: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
6910: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
6920: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
6930: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
6940: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
6950: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6960: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
6970: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6980: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
6990: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
69a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
69b0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
69c0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
69d0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
69e0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
69f0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
6a00: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
6a10: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
6a20: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
6a30: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
6a40: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
6a50: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
6a60: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
6a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6a80: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
6a90: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6aa0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
6ab0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
6ac0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
6ad0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
6ae0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
6af0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
6b00: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
6b10: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
6b20: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
6b30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
6b40: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
6b50: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
6b60: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
6b70: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
6b80: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
6b90: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
6ba0: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
6bb0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
6bc0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
6bd0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
6be0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
6bf0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
6c00: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
6c10: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6c20: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
6c30: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
6c40: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
6c50: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
6c60: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
6c70: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
6c80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
6c90: 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
6ca0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6cb0: 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
6cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
6cd0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
6ce0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
6cf0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
6d00: 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
6d10: 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
6d20: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
6d30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6d40: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
6d50: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
6d60: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
6d70: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
6d80: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
6d90: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6da0: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
6db0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6dc0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
6dd0: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
6de0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
6df0: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
6e00: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
6e10: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
6e20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6e30: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
6e40: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
6e50: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
6e60: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
6e70: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
6e80: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
6e90: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
6ea0: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
6eb0: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
6ec0: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
6ed0: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
6ee0: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
6ef0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
6f00: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
6f10: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
6f20: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
6f30: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
6f40: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
6f50: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
6f60: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
6f70: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
6f80: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
6f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6fa0: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
6fb0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6fc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6fd0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
6fe0: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
6ff0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
7000: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
7010: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
7020: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
7030: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
7040: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
7050: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
7060: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
7070: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
7080: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
7090: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
70a0: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
70b0: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
70c0: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
70d0: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
70e0: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
70f0: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
7100: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
7110: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
7130: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
7140: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
7150: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
7160: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
7170: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
7180: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7190: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
71a0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
71b0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
71c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
71d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
71e0: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
71f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7200: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7210: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
7220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7230: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7240: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
7260: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
7270: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
7280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7290: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
72a0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
72b0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
72c0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
72d0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
72e0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
72f0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
7300: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
7310: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
7320: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
7330: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
7340: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
7350: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
7360: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
7370: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
7380: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
7390: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
73a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
73b0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
73c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
73d0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
73e0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
73f0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
7400: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
7410: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
7420: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
7430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
7440: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
7450: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
7460: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7470: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
7480: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
7490: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
74a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
74b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
74c0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
74d0: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
74e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
74f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
7500: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
7510: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
7520: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
7530: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
7540: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
7550: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
7560: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
7570: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
7580: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
7590: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
75a0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
75b0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
75c0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
75d0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
75e0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
75f0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
7600: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
7610: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
7620: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
7630: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
7640: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
7650: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
7660: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
7670: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
7680: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
7690: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
76a0: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
76b0: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
76c0: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
76d0: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
76e0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
76f0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
7700: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
7710: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
7720: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
7730: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
7740: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
7750: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
7760: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
7770: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
7780: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
7790: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
77a0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
77b0: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
77c0: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
77d0: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
77e0: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
77f0: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
7800: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
7810: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
7820: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
7830: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
7840: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
7850: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7860: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
7870: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
7880: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
7890: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
78a0: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
78b0: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
78c0: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
78d0: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
78e0: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
78f0: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
7900: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
7910: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
7920: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
7930: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
7940: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
7950: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
7960: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
7970: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
7980: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
7990: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
79a0: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
79b0: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
79c0: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
79d0: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
79e0: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
79f0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
7a00: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
7a10: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
7a20: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
7a30: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
7a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a50: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
7a60: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7a70: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
7a80: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
7a90: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
7aa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7ab0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7ac0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
7ad0: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
7ae0: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
7af0: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
7b00: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
7b10: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
7b20: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7b30: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7b40: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7b50: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
7b60: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
7b70: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
7b80: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
7b90: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
7ba0: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
7bb0: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
7bc0: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
7bd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7be0: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
7bf0: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
7c00: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
7c10: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
7c20: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
7c30: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
7c40: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
7c50: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
7c60: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
7c70: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
7c80: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
7c90: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
7ca0: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
7cb0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
7cc0: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
7cd0: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
7ce0: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
7cf0: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
7d00: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
7d10: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
7d20: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
7d30: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
7d40: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
7d50: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
7d60: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
7d70: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
7d80: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
7d90: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
7da0: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
7db0: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
7dc0: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
7dd0: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
7de0: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
7df0: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
7e00: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
7e10: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7e20: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7e30: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7e40: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
7e50: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
7e60: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
7e70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7e80: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
7e90: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
7ea0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
7eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
7ec0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
7ed0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
7ee0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
7ef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f00: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
7f10: 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Page>=0 );.     
7f20: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
7f30: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
7f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7f50: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
7f60: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b  ;.  }while( p );
7f70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7f80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
7f90: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
7fa0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
7fb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7fc0: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
7fd0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7fe0: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
7ff0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
8000: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
8010: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
8020: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
8030: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
8040: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
8050: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
8060: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
8070: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
8080: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
8090: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
80a0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
80b0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
80c0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
80d0: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
80e0: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
80f0: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
8100: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
8110: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
8120: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
8130: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
8140: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
8150: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
8160: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
8170: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
8180: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
8190: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
81a0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
81b0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
81c0: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
81d0: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
81e0: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
81f0: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
8200: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
8210: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
8220: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
8230: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
8240: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
8250: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
8260: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
8270: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
8280: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
8290: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
82a0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
82b0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
82c0: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
82d0: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20   index key */.. 
82e0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
82f0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
8300: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
8310: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
8320: 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
8330: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43  npackedRecord(pC
8340: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ur->pKeyInfo);. 
8350: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
8360: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
8370: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
8380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
8390: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
83a0: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
83b0: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
83c0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
83d0: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
83e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
83f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8400: 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
8410: 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d  veto_done;.    }
8420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8430: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
8440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8450: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
8460: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
8470: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
8480: 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a  );.moveto_done:.
8490: 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
84a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
84b0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
84c0: 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b  o->db, pIdxKey);
84d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
84e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
84f0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
8500: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
8510: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
8520: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
8530: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
8540: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8550: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
8560: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
8570: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
8580: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
8590: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
85a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
85b0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
85c0: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
85d0: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
85e0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
85f0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
8600: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
8610: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
8620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
8630: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
8640: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
8650: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
8660: 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e   rc;.  int skipN
8670: 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ext;.  assert( c
8680: 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
8690: 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
86a0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
86b0: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
86c0: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
86d0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
86e0: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
86f0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
8700: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
8710: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
8720: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
8730: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
8740: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
8750: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
8760: 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69   &skipNext);.  i
8770: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8780: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8790: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
87a0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
87b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
87c0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
87d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
87e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
87f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
8800: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
8810: 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a  xt |= skipNext;.
8820: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
8830: 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e  ipNext && pCur->
8840: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
8850: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43  ALID ){.      pC
8860: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
8870: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
8880: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8890: 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20   rc;.}..#define 
88a0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
88b0: 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d  ition(p) \.  (p-
88c0: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
88d0: 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a  REQUIRESEEK ? \.
88e0: 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65           btreeRe
88f0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
8900: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
8910: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
8920: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
8930: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
8940: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
8950: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
8960: 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ion where.** it 
8970: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c  was last placed,
8980: 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76   or has been inv
8990: 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79  alidated for any
89a0: 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a   other reason..*
89b0: 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f  * Cursors can mo
89c0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
89d0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
89e0: 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20  g at is deleted 
89f0: 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65  out.** from unde
8a00: 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d  r them, for exam
8a10: 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67  ple.  Cursor mig
8a20: 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20  ht also move if 
8a30: 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65  a btree.** is re
8a40: 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
8a50: 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
8a60: 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c  tine with a NULL
8a70: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20   cursor pointer 
8a80: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a  returns false..*
8a90: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70  *.** Use the sep
8aa0: 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72  arate sqlite3Btr
8ab0: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
8ac0: 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73  ) routine to res
8ad0: 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a  tore a cursor.**
8ae0: 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69   back to where i
8af0: 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66  t ought to be if
8b00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
8b10: 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  turns true..*/.i
8b20: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
8b30: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
8b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
8b50: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
8b60: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 43  YTE_ALIGNMENT(pC
8b70: 75 72 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  ur).       || pC
8b80: 75 72 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  ur==sqlite3Btree
8b90: 46 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28  FakeValidCursor(
8ba0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
8bb0: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
8bc0: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
8bd0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
8be0: 28 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3d 3d  (pCur->eState)==
8bf0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 43 55  1 );.  return CU
8c00: 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d 20 2a 28  RSOR_VALID != *(
8c10: 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a  u8*)pCur;.}../*.
8c20: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
8c30: 74 65 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74  ter to a fake Bt
8c40: 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68  Cursor object th
8c50: 61 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61  at will always a
8c60: 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74  nswer.** false t
8c70: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  o the sqlite3Btr
8c80: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
8c90: 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
8ca0: 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63  .  The fake.** c
8cb0: 75 72 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d  ursor returned m
8cc0: 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
8cd0: 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42  with any other B
8ce0: 74 72 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a  tree interface..
8cf0: 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c  */.BtCursor *sql
8d00: 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c  ite3BtreeFakeVal
8d10: 69 64 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a  idCursor(void){.
8d20: 20 20 73 74 61 74 69 63 20 75 38 20 66 61 6b 65    static u8 fake
8d30: 43 75 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f  Cursor = CURSOR_
8d40: 56 41 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28  VALID;.  assert(
8d50: 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
8d60: 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29  or, eState)==0 )
8d70: 3b 0a 20 20 72 65 74 75 72 6e 20 28 42 74 43 75  ;.  return (BtCu
8d80: 72 73 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f  rsor*)&fakeCurso
8d90: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
8da0: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
8db0: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
8dc0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
8dd0: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
8de0: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
8df0: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
8e00: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
8e10: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
8e20: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
8e30: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
8e40: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
8e50: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
8e60: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
8e70: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
8e80: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
8e90: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
8ea0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
8eb0: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
8ec0: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
8ed0: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
8ee0: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
8ef0: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
8f00: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
8f10: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
8f20: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
8f30: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
8f40: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
8f50: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
8f60: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
8f70: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
8f80: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
8f90: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
8fa0: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
8fb0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
8fc0: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
8fd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
8fe0: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
8ff0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
9000: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
9010: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
9020: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
9030: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
9040: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
9050: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
9060: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
9070: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
9080: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
9090: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
90a0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
90b0: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
90c0: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
90d0: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
90e0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
90f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
9100: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
9110: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
9120: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
9130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9140: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
9150: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9160: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
9170: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74  .** Provide hint
9180: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
9190: 20 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72    The particular
91a0: 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64   hint given (and
91b0: 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64   the type.** and
91c0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76   number of the v
91d0: 61 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72  arargs parameter
91e0: 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  s) is determined
91f0: 20 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70   by the eHintTyp
9200: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20  e.** parameter. 
9210: 20 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74   See the definit
9220: 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45  ions of the BTRE
9230: 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20  E_HINT_* macros 
9240: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
9250: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
9260: 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75  eCursorHint(BtCu
9270: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
9280: 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b  eHintType, ...){
9290: 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  /* Used only 
92a0: 62 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73  by system that s
92b0: 75 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20  ubstitute their 
92c0: 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69  own storage engi
92d0: 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ne */.}.#endif..
92e0: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c  /*.** Provide fl
92f0: 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  ag hints to the 
9300: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
9310: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
9320: 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75  orHintFlags(BtCu
9330: 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69  rsor *pCur, unsi
9340: 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72  gned x){.  asser
9350: 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b  t( x==BTREE_SEEK
9360: 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f  _EQ || x==BTREE_
9370: 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30  BULKLOAD || x==0
9380: 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74   );.  pCur->hint
9390: 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  s = x;.}...#ifnd
93a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
93b0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
93c0: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
93d0: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
93e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
93f0: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
9400: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
9410: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
9420: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
9430: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
9440: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
9450: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   number..**.** R
9460: 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76  eturn 0 (not a v
9470: 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70  alid page) for p
9480: 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65  gno==1 since the
9490: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e  re is.** no poin
94a0: 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74  ter map associat
94b0: 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20  ed with page 1. 
94c0: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63   The integrity_c
94d0: 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65  heck logic.** re
94e0: 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d  quires that ptrm
94f0: 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31  apPageno(*,1)!=1
9500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
9510: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
9520: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
9530: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
9540: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
9550: 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c  .  Pgno iPtrMap,
9560: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
9570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9580: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
9590: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29  ;.  if( pgno<2 )
95a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61   return 0;.  nPa
95b0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
95c0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
95d0: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
95e0: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
95f0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
9600: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
9610: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
9620: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
9630: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
9640: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
9650: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
9660: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
9670: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
9680: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
9690: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
96a0: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
96b0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
96c0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
96d0: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
96e0: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
96f0: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
9700: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
9710: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
9720: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73  **.** If *pRC is
9730: 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a   initially non-z
9740: 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f  ero (non-SQLITE_
9750: 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OK) then this ro
9760: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f  utine is.** a no
9770: 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  -op.  If an erro
9780: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70  r occurs, the ap
9790: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
97a0: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a  code is written.
97b0: 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f  ** into *pRC..*/
97c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
97d0: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
97e0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
97f0: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
9800: 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29  arent, int *pRC)
9810: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
9820: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
9830: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
9840: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
9850: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
9860: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
9870: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
9880: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
9890: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
98a0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
98b0: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
98c0: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
98d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
98e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   rc;           /
98f0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
9900: 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
9910: 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
9920: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
9930: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9940: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
9950: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
9960: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
9970: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6e 65 76  ge number is nev
9980: 65 72 20 61 64 64 65 64 20 74 6f 20 61 20 70 6f  er added to a po
9990: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 2a  inter-map page *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
99b0: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
99c0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
99d0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 23 69  AGE(pBt)) );..#i
99e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
99f0: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
9a00: 66 28 20 70 42 74 2d 3e 70 4d 61 70 20 29 7b 0a  f( pBt->pMap ){.
9a10: 20 20 20 20 2a 70 52 43 20 3d 20 62 74 72 65 65      *pRC = btree
9a20: 50 74 72 6d 61 70 53 74 6f 72 65 28 70 42 74 2c  PtrmapStore(pBt,
9a30: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
9a40: 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ent);.    return
9a50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
9a60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
9a70: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
9a80: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
9a90: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
9aa0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
9ab0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
9ac0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
9ad0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
9ae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
9af0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
9b00: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
9b10: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
9b20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9b30: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
9b40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9b50: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
9b60: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
9b70: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
9b80: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
9b90: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
9ba0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9bb0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
9bc0: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
9bd0: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
9be0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
9bf0: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
9c00: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
9c10: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
9c20: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
9c30: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
9c40: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
9c50: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
9c60: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
9c70: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
9c80: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
9c90: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
9ca0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
9cb0: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
9cc0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
9cd0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
9ce0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9cf0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
9d00: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
9d10: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
9d20: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
9d30: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
9d40: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
9d50: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
9d60: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
9d70: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
9d80: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
9d90: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
9da0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9db0: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
9dc0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
9dd0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
9de0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
9df0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
9e00: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
9e10: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
9e20: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
9e30: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
9e40: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
9e50: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
9e60: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
9e70: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
9e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
9e90: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
9ea0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
9eb0: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
9ec0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
9ed0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
9ee0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9ef0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
9f00: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
9f10: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
9f20: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
9f30: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
9f40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
9f50: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
9f60: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
9f70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
9f80: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
9f90: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
9fa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9fb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9fc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
9fd0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
9fe0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
9ff0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
a000: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
a010: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
a020: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
a030: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
a040: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
a050: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
a060: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
a070: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
a080: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
a090: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
a0a0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
a0b0: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
a0c0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
a0d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
a0e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a0f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a100: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
a110: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
a120: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
a130: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
a140: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
a150: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
a160: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
a170: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
a180: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
a190: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
a1a0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
a1b0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
a1c0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
a1d0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
a1e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
a1f0: 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72  NO(iPtrmap);.  r
a200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a210: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
a220: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
a230: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
a240: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
a250: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
a260: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
a270: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
a280: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
a290: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
a2a0: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
a2b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
a2c0: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
a2d0: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
a2e0: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
a2f0: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
a300: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
a310: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
a320: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
a330: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
a340: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
a350: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69  ontent..**.** fi
a360: 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20  ndCellPastPtr() 
a370: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78  does the same ex
a380: 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61  cept it skips pa
a390: 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  st the initial.*
a3a0: 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70  * 4-byte child p
a3b0: 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20  ointer found on 
a3c0: 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20  interior pages, 
a3d0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
a3e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a3f0: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
a400: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
a410: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
a420: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
a430: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
a440: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
a450: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
a460: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
a470: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
a480: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
a490: 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  ).#define findCe
a4a0: 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c  llPastPtr(P,I) \
a4b0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66  .  ((P)->aDataOf
a4c0: 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  st + ((P)->maskP
a4d0: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
a4e0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
a4f0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a  lIdx[2*(I)])))..
a500: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
a510: 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65  ommon tail proce
a520: 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50  ssing for btreeP
a530: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
a540: 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  d.** btreeParseC
a550: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f  ellPtrIndex() fo
a560: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
a570: 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f  the cell does no
a580: 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a  t fit entirely.*
a590: 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d  * on a single B-
a5a0: 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65  tree page.  Make
a5b0: 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
a5c0: 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65  tments to the Ce
a5d0: 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  llInfo.** struct
a5e0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ure..*/.static S
a5f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
a600: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
a610: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
a620: 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61  verflow(.  MemPa
a630: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a640: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a650: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a660: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a680: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
a690: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
a6a0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
a6b0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a6c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
a6d0: 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  */.){.  /* If th
a6e0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
a6f0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
a700: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
a710: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a  age, we have.  *
a720: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
a730: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
a740: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
a750: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
a760: 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70  .  ** overflow p
a770: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
a780: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
a790: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
a7a0: 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61   unused.  ** spa
a7b0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
a7c0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
a7d0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
a7e0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
a7f0: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
a800: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
a810: 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ocal..  **.  ** 
a820: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
a830: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
a840: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
a850: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
a860: 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20  y.  ** way will 
a870: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
a880: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
a890: 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ormat..  */.  in
a8a0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
a8b0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
a8c0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
a8d0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
a8e0: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
a8f0: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
a900: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
a910: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ally */.  int su
a920: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
a930: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
a940: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
a950: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d   storage */..  m
a960: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a970: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78  >minLocal;.  max
a980: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
a990: 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c  axLocal;.  surpl
a9a0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
a9b0: 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
a9c0: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
a9d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a9e0: 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63  Size-4);.  testc
a9f0: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
aa00: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
aa10: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
aa20: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
aa30: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
aa40: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49  xLocal ){.    pI
aa50: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
aa60: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65  16)surplus;.  }e
aa70: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
aa80: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
aa90: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49  nLocal;.  }.  pI
aaa0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31  nfo->nSize = (u1
aab0: 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  6)(&pInfo->pPayl
aac0: 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  oad[pInfo->nLoca
aad0: 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b  l] - pCell) + 4;
aae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
aaf0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
ab00: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
ab10: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
ab20: 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29  age.xParseCell()
ab30: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
ab40: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
ab50: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
ab60: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
ab70: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
ab80: 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  .**.** btreePars
ab90: 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20  eCellPtr()      
aba0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
abb0: 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a  ee leaf nodes.**
abc0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e   btreeParseCellN
abd0: 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20  oPayload()  =>  
abe0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74   table btree int
abf0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62  ernal nodes.** b
ac00: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
ac10: 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69  Index()   =>   i
ac20: 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73  ndex btree nodes
ac30: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
ac40: 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66  also a wrapper f
ac50: 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72  unction btreePar
ac60: 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  seCell() that wo
ac70: 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d  rks for.** all M
ac80: 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64  emPage types and
ac90: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
aca0: 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64   the cell by ind
acb0: 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a  ex rather than.*
acc0: 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  * by pointer..*/
acd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
ace0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
acf0: 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61  Payload(.  MemPa
ad00: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
ad10: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
ad20: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
ad30: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ad50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
ad60: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
ad70: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
ad80: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
ad90: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
ada0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
adb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
adc0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
add0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ade0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
adf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ae00: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
ae10: 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66  ze==4 );.#ifndef
ae20: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ae30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ae40: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
ae50: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
ae60: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
ae70: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
ae80: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
ae90: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
aea0: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e   = 0;.  pInfo->n
aeb0: 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e  Local = 0;.  pIn
aec0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
aed0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
aee0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
aef0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
af00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
af10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
af20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
af30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
af40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
af50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
af60: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
af70: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
af80: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
af90: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
afa0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
afb0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
afc0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
afd0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
afe0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
aff0: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
b000: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b010: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
b020: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b040: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
b050: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
b060: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b070: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b080: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b090: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
b0a0: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
b0b0: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
b0c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
b0d0: 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65  eyLeaf );.  asse
b0e0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
b0f0: 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  PtrSize==0 );.  
b100: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a  pIter = pCell;..
b110: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c    /* The next bl
b120: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65  ock of code is e
b130: 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20  quivalent to:.  
b140: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65  **.  **     pIte
b150: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
b160: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
b170: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
b180: 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64   code is inlined
b190: 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63   to avoid a func
b1a0: 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a  tion call..  */.
b1b0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
b1c0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
b1d0: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
b1e0: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
b1f0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
b200: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
b210: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
b220: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
b230: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
b240: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
b250: 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30  ile( (*pIter)>=0
b260: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
b270: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
b280: 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
b290: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
b2a0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
b2b0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
b2c0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
b2d0: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
b2e0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
b2f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
b300: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
b310: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
b320: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  n call..  */.  i
b330: 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  Key = *pIter;.  
b340: 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29  if( iKey>=0x80 )
b350: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
b360: 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20   &pIter[7];.    
b370: 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20  iKey &= 0x7f;.  
b380: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
b390: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
b3a0: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
b3b0: 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66   0x7f);.      if
b3c0: 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20  ( (*pIter)<0x80 
b3d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
b3e0: 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29  f( pIter>=pEnd )
b3f0: 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  {.        iKey =
b400: 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b   (iKey<<8) | *++
b410: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62  pIter;.        b
b420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b430: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b    }.  }.  pIter+
b440: 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  +;..  pInfo->nKe
b450: 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79  y = *(i64*)&iKey
b460: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
b470: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
b480: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
b490: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
b4a0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
b4b0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
b4c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
b4d0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
b4e0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
b4f0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
b500: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
b510: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
b520: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
b530: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
b540: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
b550: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
b560: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
b570: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
b580: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
b590: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
b5a0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
b5b0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
b5c0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
b5d0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
b5e0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
b5f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
b600: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
b610: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
b620: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
b630: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
b640: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
b650: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
b660: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
b670: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
b680: 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ex(.  MemPage *p
b690: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
b6a0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
b6b0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
b6c0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
b6d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b6e0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
b6f0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
b700: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
b710: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
b720: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
b730: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
b740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
b750: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
b760: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
b770: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
b780: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b790: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
b7a0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
b7b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b7c0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b7d0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b7f0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
b800: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
b810: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
b820: 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a  ntKeyLeaf==0 );.
b830: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20    pIter = pCell 
b840: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
b850: 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61  rSize;.  nPayloa
b860: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
b870: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
b880: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
b890: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
b8a0: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
b8b0: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
b8c0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
b8d0: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
b8e0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
b8f0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
b900: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
b910: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
b920: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e    pIter++;.  pIn
b930: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
b940: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  oad;.  pInfo->nP
b950: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
b960: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  d;.  pInfo->pPay
b970: 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20  load = pIter;.  
b980: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
b990: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
b9a0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
b9b0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
b9c0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
b9d0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
b9e0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
b9f0: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
ba00: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
ba10: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
ba20: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
ba30: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
ba40: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
ba50: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
ba60: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
ba70: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
ba80: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
ba90: 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  + (u16)(pIter - 
baa0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
bab0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29  pInfo->nSize<4 )
bac0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
bad0: 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  4;.    pInfo->nL
bae0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
baf0: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
bb00: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
bb10: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
bb20: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
bb30: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
bb40: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
bb50: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20  treeParseCell(. 
bb60: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
bb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bb80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
bb90: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
bba0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
bbb0: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
bbc0: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
bbd0: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
bbe0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
bbf0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
bc00: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
bc10: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  ){.  pPage->xPar
bc20: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69  seCell(pPage, fi
bc30: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
bc40: 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  ell), pInfo);.}.
bc50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
bc60: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
bc70: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
bc80: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
bc90: 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65  .xCellSize.** me
bca0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  thod..**.** Comp
bcb0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
bcc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
bcd0: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
bce0: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
bcf0: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
bd00: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
bd10: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
bd20: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
bd30: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
bd40: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
bd50: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
bd60: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
bd70: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
bd80: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
bd90: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  l pointer..**.**
bda0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
bdb0: 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20  yload()    =>   
bdc0: 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e  table internal n
bdd0: 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  odes.** cellSize
bde0: 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20  Ptr()           
bdf0: 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78    =>   all index
be00: 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c   nodes & table l
be10: 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61  eaf nodes.*/.sta
be20: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
be30: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
be40: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
be50: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43    u8 *pIter = pC
be60: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
be70: 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f  ldPtrSize; /* Fo
be80: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
be90: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
bea0: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bed0: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
bee0: 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53  rint */.  u32 nS
bef0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65     /* Size value
bf20: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23   to return */..#
bf30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
bf40: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
bf50: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
bf60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
bf70: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
bf80: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
bf90: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
bfa0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
bfb0: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
bfc0: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
bfd0: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
bfe0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
bff0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
c000: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
c010: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
c020: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
c030: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
c040: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
c050: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
c060: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
c070: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
c080: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
c090: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
c0a0: 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65  .  nSize = *pIte
c0b0: 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d  r;.  if( nSize>=
c0c0: 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64  0x80 ){.    pEnd
c0d0: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
c0e0: 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b    nSize &= 0x7f;
c0f0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
c100: 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37  Size = (nSize<<7
c110: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
c120: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
c130: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
c140: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
c150: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
c160: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
c170: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
c180: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
c190: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
c1a0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
c1b0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
c1c0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
c1d0: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
c1e0: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
c1f0: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
c200: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
c210: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
c220: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
c230: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
c240: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
c250: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
c260: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
c270: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
c280: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
c290: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
c2a0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
c2b0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
c2c0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
c2d0: 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d  f( nSize<=pPage-
c2e0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
c2f0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
c300: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
c310: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
c320: 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d  ) nSize = 4;.  }
c330: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69  else{.    int mi
c340: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
c350: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
c360: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
c370: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
c380: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
c390: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c3a0: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
c3b0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
c3c0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
c3d0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
c3e0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
c3f0: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  +1 );.    if( nS
c400: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
c410: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
c420: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
c430: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
c440: 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65  = 4 + (u16)(pIte
c450: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  r - pCell);.  }.
c460: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
c470: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
c480: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
c490: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
c4a0: 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20  nSize;.}.static 
c4b0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  u16 cellSizePtrN
c4c0: 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65  oPayload(MemPage
c4d0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
c4e0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
c4f0: 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a   = pCell + 4; /*
c500: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
c510: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
c520: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c540: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
c550: 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  arint */..#ifdef
c560: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c570: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
c580: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
c590: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
c5a0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
c5b0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
c5c0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
c5d0: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
c5e0: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
c5f0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
c600: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
c610: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
c620: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
c630: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
c640: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
c650: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
c660: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
c670: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
c680: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
c690: 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  nfo;.  pPage->xP
c6a0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
c6b0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
c6c0: 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  o);.#else.  UNUS
c6d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
c6e0: 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ge);.#endif..  a
c6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
c700: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
c710: 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20  .  pEnd = pIter 
c720: 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a  + 9;.  while( (*
c730: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
c740: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
c750: 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e   assert( debugin
c760: 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28  fo.nSize==(u16)(
c770: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c  pIter - pCell) |
c780: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
c790: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
c7a0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d  Iter - pCell);.}
c7b0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
c7c0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
c7d0: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
c7e0: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
c7f0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
c800: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
c810: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
c820: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
c830: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
c840: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
c850: 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c  turn pPage->xCel
c860: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e  lSize(pPage, fin
c870: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
c880: 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ll));.}.#endif..
c890: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c8a0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
c8b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
c8c0: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
c8d0: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
c8e0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
c8f0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
c900: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
c910: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
c920: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
c930: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
c940: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
c950: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66  oid ptrmapPutOvf
c960: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
c970: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20  age, u8 *pCell, 
c980: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c  int *pRC){.  Cel
c990: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66  lInfo info;.  if
c9a0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
c9b0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
c9c0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  !=0 );.  pPage->
c9d0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
c9e0: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
c9f0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63  .  if( info.nLoc
ca00: 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
ca10: 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66   ){.    Pgno ovf
ca20: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
ca30: 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell[info.nSize-4
ca40: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
ca50: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
ca60: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
ca70: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
ca80: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
ca90: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
caa0: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
cab0: 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f  e given. This ro
cac0: 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65  utine reorganize
cad0: 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74  s cells within t
cae0: 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68  he.** page so th
caf0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
cb00: 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74  free-blocks on t
cb10: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69  he free-block li
cb20: 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  st..**.** Parame
cb30: 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20  ter nMaxFrag is 
cb40: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
cb50: 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  nt of fragmented
cb60: 20 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20   space that may 
cb70: 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  be.** present in
cb80: 20 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20   the page after 
cb90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
cba0: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44  urns..**.** EVID
cbb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32  ENCE-OF: R-44582
cbc0: 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61  -60138 SQLite ma
cbd0: 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74  y from time to t
cbe0: 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61  ime reorganize a
cbf0: 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20  .** b-tree page 
cc00: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
cc10: 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20  e no freeblocks 
cc20: 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65  or fragment byte
cc30: 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64  s, all.** unused
cc40: 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61   bytes are conta
cc50: 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c  ined in the unal
cc60: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65  located space re
cc70: 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a  gion, and all.**
cc80: 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65   cells are packe
cc90: 64 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65  d tightly at the
cca0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
ccb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ccc0: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
ccd0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
cce0: 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20  nt nMaxFrag){.  
ccf0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
cd00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
cd10: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
cd20: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
cd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
cd40: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74  dress of the i-t
cd50: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
cd60: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
cd70: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
cd80: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
cd90: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
cda0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
cdb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
cdc0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
cdd0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
cde0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cdf0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
ce00: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
ce10: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
ce20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ce30: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
ce40: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
ce50: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce70: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
ce80: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ce90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
cec0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
ced0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cee0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
cef0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
cf00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
cf10: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
cf20: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
cf30: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
cf40: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cf50: 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f  r *src;        /
cf60: 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74  * Source of cont
cf70: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
cf80: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
cf90: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
cfa0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
cfb0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
cfc0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
cfd0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
cfe0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
cff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
d000: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
d010: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
d020: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d030: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d050: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d060: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
d070: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
d080: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d090: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
d0a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d0b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d0c0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d0d0: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
d0e0: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
d0f0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
d100: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
d110: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
d120: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
d130: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
d140: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
d150: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
d160: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d170: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c  dr+3]) );.  iCel
d180: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
d190: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
d1a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
d1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d1c0: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Size;..  /* This
d1d0: 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70   block handles p
d1e0: 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72  ages with two or
d1f0: 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63   fewer free bloc
d200: 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a  ks and nMaxFrag.
d210: 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72    ** or fewer fr
d220: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20  agmented bytes. 
d230: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
d240: 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76  is faster to mov
d250: 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28  e the.  ** two (
d260: 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f  or one) blocks o
d270: 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65  f cells using me
d280: 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20  mmove() and add 
d290: 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a  the required.  *
d2a0: 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63  * offsets to eac
d2b0: 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  h pointer in the
d2c0: 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
d2d0: 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20 74  ray than it is t
d2e0: 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72  o .  ** reconstr
d2f0: 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20 70  uct the entire p
d300: 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  age.  */.  if( (
d310: 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c  int)data[hdr+7]<
d320: 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20  =nMaxFrag ){.   
d330: 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74   int iFree = get
d340: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d350: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  1]);.    if( iFr
d360: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
d370: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
d380: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
d390: 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46  ..      /* pageF
d3a0: 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c  indSlot() has al
d3b0: 72 65 61 64 79 20 76 65 72 69 66 69 65 64 20 74  ready verified t
d3c0: 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  hat free blocks 
d3d0: 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20  are sorted.     
d3e0: 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20   ** in order of 
d3f0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  offset within th
d400: 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74  e page, and that
d410: 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64   no block extend
d420: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20  s.      ** past 
d430: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
d440: 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68  age. Provided th
d450: 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73  e two free slots
d460: 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a   do not .      *
d470: 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20  * overlap, this 
d480: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
d490: 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61  the memmove() ca
d4a0: 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  lls below will n
d4b0: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ot.      ** over
d4c0: 77 72 69 74 65 20 74 68 65 20 75 73 61 62 6c 65  write the usable
d4d0: 53 69 7a 65 20 62 79 74 65 20 62 75 66 66 65 72  Size byte buffer
d4e0: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 64 61  , even if the da
d4f0: 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20  tabase page.    
d500: 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e    ** is corrupt.
d510: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
d520: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
d530: 69 46 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a  iFree2>iFree );.
d540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
d550: 72 65 65 2b 67 65 74 32 62 79 74 65 28 26 64 61  ree+get2byte(&da
d560: 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20  ta[iFree+2]) <= 
d570: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d580: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
d590: 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b  e2==0 || iFree2+
d5a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d5b0: 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61  Free2+2]) <= usa
d5c0: 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  bleSize );..    
d5d0: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
d5e0: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
d5f0: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
d600: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
d610: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
d620: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
d630: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
d640: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
d650: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
d660: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
d670: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
d680: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
d690: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
d6a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d6b0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
d6c0: 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65    if( top>=iFree
d6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
d6e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d6f0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
d700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d710: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d730: 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d 69 46 72  t( iFree+sz<=iFr
d740: 65 65 32 20 29 3b 20 2f 2a 20 56 65 72 69 66 69  ee2 ); /* Verifi
d750: 65 64 20 62 79 20 70 61 67 65 46 69 6e 64 53 6c  ed by pageFindSl
d760: 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ot() */.        
d770: 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65    sz2 = get2byte
d780: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
d790: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
d7a0: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a  ert( iFree+sz+sz
d7b0: 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  2+iFree2-(iFree+
d7c0: 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  sz) <= usableSiz
d7d0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  e );.          m
d7e0: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72  emmove(&data[iFr
d7f0: 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74  ee+sz+sz2], &dat
d800: 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72  a[iFree+sz], iFr
d810: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b  ee2-(iFree+sz));
d820: 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d  .          sz +=
d830: 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz2;.        }.
d840: 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74          cbrk = t
d850: 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  op+sz;.        a
d860: 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72  ssert( cbrk+(iFr
d870: 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c  ee-top) <= usabl
d880: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
d890: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63   memmove(&data[c
d8a0: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d  brk], &data[top]
d8b0: 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20  , iFree-top);.  
d8c0: 20 20 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d        for(pAddr=
d8d0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
d8e0: 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70  ]; pAddr<pEnd; p
d8f0: 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20  Addr+=2){.      
d900: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
d910: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20  e(pAddr);.      
d920: 20 20 20 20 69 66 28 20 70 63 3c 69 46 72 65 65      if( pc<iFree
d930: 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64   ){ put2byte(pAd
d940: 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20  dr, pc+sz); }.  
d950: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
d960: 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75   pc<iFree2 ){ pu
d970: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
d980: 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20  +sz2); }.       
d990: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
d9a0: 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a  defragment_out;.
d9b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d9c0: 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  }..  cbrk = usab
d9d0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c  leSize;.  iCellL
d9e0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
d9f0: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
da00: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
da10: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
da20: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
da30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
da40: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
da50: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
da60: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
da70: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
da80: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
da90: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
daa0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
dab0: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
dac0: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
dad0: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
dae0: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
daf0: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
db00: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
db10: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
db20: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
db30: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
db40: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
db50: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
db60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
db70: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
db80: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
db90: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
dba0: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
dbb0: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
dbc0: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
dbd0: 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63  e(pPage, &src[pc
dbe0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
dbf0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62  size;.    if( cb
dc00: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
dc10: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
dc20: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
dc30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
dc40: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
dc50: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
dc60: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
dc70: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
dc80: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
dc90: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
dca0: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
dcb0: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
dcc0: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
dcd0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
dce0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
dcf0: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
dd00: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
dd10: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
dd20: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
dd30: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
dd40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
dd50: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
dd60: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
dd70: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
dd80: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
dd90: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
dda0: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
ddb0: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
ddc0: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
ddd0: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
dde0: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
ddf0: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
de00: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
de10: 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72  r+7] = 0;.. defr
de20: 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66  agment_out:.  if
de30: 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62  ( data[hdr+7]+cb
de40: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
de50: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
de60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
de70: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
de80: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  age);.  }.  asse
de90: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
dea0: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
deb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
dec0: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
ded0: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
dee0: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
def0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
df00: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
df10: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
df20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
df30: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
df40: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
df50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
df60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
df70: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
df80: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
df90: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
dfa0: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
dfb0: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
dfc0: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
dfd0: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
dfe0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
dff0: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
e000: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
e010: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
e020: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
e030: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
e040: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
e050: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
e060: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
e070: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
e080: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
e090: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
e0a0: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
e0b0: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
e0c0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
e0d0: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
e0e0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
e0f0: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
e100: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
e110: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
e120: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
e130: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
e140: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
e150: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
e160: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
e170: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
e180: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
e190: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
e1a0: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
e1b0: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
e1c0: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
e1d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
e1e0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
e1f0: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
e200: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
e210: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
e220: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
e230: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
e240: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
e250: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
e260: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
e270: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
e280: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
e290: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
e2a0: 69 7a 65 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ize;.  int size;
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e2c0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
e2d0: 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  slot */..  asser
e2e0: 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69  t( pc>0 );.  whi
e2f0: 6c 65 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69  le( pc<=usableSi
e300: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45  ze-4 ){.    /* E
e310: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
e320: 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68  710-53328 The th
e330: 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62  ird and fourth b
e340: 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20  ytes of each.   
e350: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f   ** freeblock fo
e360: 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  rm a big-endian 
e370: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
e380: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e390: 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a   freeblock.    *
e3a0: 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c  * in bytes, incl
e3b0: 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65  uding the 4-byte
e3c0: 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
e3d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
e3e0: 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  &aData[pc+2]);. 
e3f0: 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65     if( (x = size
e400: 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a   - nByte)>=0 ){.
e410: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e420: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65  x==4 );.      te
e430: 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a  stcase( x==3 );.
e440: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 2b 70        if( size+p
e450: 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29  c > usableSize )
e460: 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  {.        *pRc =
e470: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e480: 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20  PAGE(pPg);.     
e490: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
e4a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34     }else if( x<4
e4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
e4c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
e4d0: 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77  498-58022 In a w
e4e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
e4f0: 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61  e page, the tota
e500: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  l.        ** num
e510: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
e520: 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f  fragments may no
e530: 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a  t exceed 60. */.
e540: 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74          if( aDat
e550: 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65  a[hdr+7]>57 ) re
e560: 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20  turn 0;..       
e570: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
e580: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
e590: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
e5a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
e5b0: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
e5c0: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
e5d0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
e5e0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
e5f0: 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74  ta[iAddr], &aDat
e600: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
e610: 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20     aData[hdr+7] 
e620: 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20  += (u8)x;.      
e630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
e640: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
e650: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
e660: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
e670: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
e680: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
e690: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
e6a0: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
e6b0: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
e6c0: 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61     put2byte(&aDa
e6d0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
e6e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
e6f0: 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78  rn &aData[pc + x
e700: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64  ];.    }.    iAd
e710: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20  dr = pc;.    pc 
e720: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
e730: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[pc]);.    if( 
e740: 70 63 3c 69 41 64 64 72 2b 73 69 7a 65 20 29 20  pc<iAddr+size ) 
e750: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
e760: 20 70 63 20 29 7b 0a 20 20 20 20 2a 70 52 63 20   pc ){.    *pRc 
e770: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
e780: 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a  _PAGE(pPg);.  }.
e790: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e7a0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
e7b0: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
e7c0: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
e7d0: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
e7e0: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
e7f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
e800: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64   Write into *pId
e810: 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  x the index into
e820: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a   pPage->aData[].
e830: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
e840: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
e850: 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20  d space. Return 
e860: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b  either SQLITE_OK
e870: 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   or.** an error 
e880: 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51  code (usually SQ
e890: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
e8a0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
e8b0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
e8c0: 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69  there is suffici
e8d0: 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b  ent space to mak
e8e0: 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e the.** allocat
e8f0: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
e900: 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ne might need to
e910: 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f   defragment in o
e920: 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a  rder to bring.**
e930: 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74   all the space t
e940: 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72  ogether, however
e950: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
e960: 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67  will avoid using
e970: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
e980: 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65  o bytes past the
e990: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
e9a0: 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61  ea since presuma
e9b0: 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f  bly this.** allo
e9c0: 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  cation is being 
e9d0: 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  made in order to
e9e0: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   insert a new ce
e9f0: 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a  ll, so we will.*
ea00: 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65  * also end up ne
ea10: 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c  eding a new cell
ea20: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
ea30: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
ea40: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
ea50: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c  Page, int nByte,
ea60: 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63   int *pIdx){.  c
ea70: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
ea80: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ea90: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
eaa0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
eab0: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
eac0: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
ead0: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
eae0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
eaf0: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
eb00: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
eb30: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
eb40: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
eb50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
eb60: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
eb70: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
eb80: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  r return code */
eb90: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
eba0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ebb0: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
ebc0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
ebd0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
ebe0: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
ebf0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
ec00: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
ec10: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
ec20: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
ec30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ec40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ec50: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
ec60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
ec70: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
ec80: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
ec90: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
eca0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
ecb0: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
ecc0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
ecd0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
ece0: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e  ert( nByte < (in
ecf0: 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t)(pPage->pBt->u
ed00: 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a  sableSize-8) );.
ed10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ed20: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
ed30: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
ed40: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
ed50: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
ed60: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
ed70: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
ed80: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
ed90: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
eda0: 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20  : R-29356-02391 
edb0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
edc0: 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74  uses a 65536-byt
edd0: 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a  e page size.  **
ede0: 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65   and the reserve
edf0: 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20  d space is zero 
ee00: 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65  (the usual value
ee10: 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70   for reserved sp
ee20: 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ace).  ** then t
ee30: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ee40: 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70  offset of an emp
ee50: 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f  ty page wants to
ee60: 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20   be 65536..  ** 
ee70: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e  However, that in
ee80: 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72  teger is too lar
ee90: 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20  ge to be stored 
eea0: 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69  in a 2-byte unsi
eeb0: 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65  gned.  ** intege
eec0: 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66  r, so a value of
eed0: 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74   0 is used in it
eee0: 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f  s place. */.  to
eef0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
ef00: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73  ta[hdr+5]);.  as
ef10: 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29  sert( top<=(int)
ef20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ef30: 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65  leSize ); /* Pre
ef40: 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e  vent by getAndIn
ef50: 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66  itPage() */.  if
ef60: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
ef70: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
ef80: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ef90: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
efa0: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
efb0: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
efc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
efd0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
efe0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
eff0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
f000: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
f010: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
f020: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
f030: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
f040: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
f050: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
f060: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
f070: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
f080: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
f090: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
f0a0: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
f0b0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
f0c0: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
f0d0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
f0e0: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
f0f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
f100: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
f110: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
f120: 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68  );.  if( (data[h
f130: 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+2] || data[hd
f140: 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d  r+1]) && gap+2<=
f150: 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  top ){.    u8 *p
f160: 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64  Space = pageFind
f170: 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74  Slot(pPage, nByt
f180: 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  e, &rc);.    if(
f190: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
f1a0: 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e   assert( pSpace>
f1b0: 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65  =data && (pSpace
f1c0: 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29   - data)<65536 )
f1d0: 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  ;.      *pIdx = 
f1e0: 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64  (int)(pSpace - d
f1f0: 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
f200: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f210: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
f220: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
f230: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
f240: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63  /* The request c
f250: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66  ould not be fulf
f260: 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72  illed using a fr
f270: 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68  eelist slot.  Ch
f280: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
f290: 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69  if defragmentati
f2a0: 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  on is necessary.
f2b0: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
f2c0: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
f2d0: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
f2e0: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
f2f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f300: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52  ->nCell>0 || COR
f310: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72  RUPT_DB );.    r
f320: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
f330: 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c  ge(pPage, MIN(4,
f340: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20   pPage->nFree - 
f350: 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20  (2+nByte)));.   
f360: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
f370: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
f380: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
f390: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f3a0: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b    assert( gap+2+
f3b0: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
f3c0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
f3d0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
f3e0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
f3f0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
f400: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
f410: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
f420: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
f430: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
f440: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
f450: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
f460: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
f470: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
f480: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
f490: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
f4a0: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
f4b0: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
f4c0: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
f4d0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
f4e0: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
f4f0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
f500: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
f510: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
f520: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
f530: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
f540: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
f550: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
f560: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
f570: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
f580: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
f590: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f5a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f5b0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
f5c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
f5d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
f5e0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
f5f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
f600: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
f610: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
f620: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
f630: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
f640: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
f650: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
f660: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
f670: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
f680: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
f690: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
f6a0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
f6b0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
f6c0: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
f6d0: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
f6e0: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
f6f0: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
f700: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
f710: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
f720: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
f730: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
f740: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
f750: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
f760: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
f770: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
f780: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
f790: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
f7a0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
f7b0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
f7c0: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
f7d0: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
f7e0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
f7f0: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
f800: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
f810: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
f820: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f850: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
f860: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
f870: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
f880: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
f890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f8a0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
f8b0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
f8c0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
f8f0: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
f900: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
f910: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
f940: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
f950: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
f960: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
f970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
f980: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
f990: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78  iSize */.  u16 x
f9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
f9d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f9e0: 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20  */.  u32 iEnd = 
f9f0: 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20  iStart + iSize; 
fa00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
fa10: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
fa20: 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20  e iStart buffer 
fa30: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
fa40: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
fa50: 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61  ->aData;   /* Pa
fa60: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ge content */.. 
fa70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fa80: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
fa90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
faa0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
fab0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
fac0: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
fad0: 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70  _DB || iStart>=p
fae0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
faf0: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
fb00: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
fb10: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
fb20: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
fb30: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
fb40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
fb50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fb60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
fb70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
fb80: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
fb90: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
fba0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
fbb0: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61  ert( iStart<=pPa
fbc0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
fbd0: 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54  ize-4 );..  /* T
fbe0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
fbf0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
fc00: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
fc10: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
fc20: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
fc30: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
fc40: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
fc50: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
fc60: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fc70: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
fc80: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
fc90: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
fca0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
fcb0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
fcc0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
fcd0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
fce0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
fcf0: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
fd00: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
fd10: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
fd20: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c  e(&data[iPtr]))<
fd30: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
fd40: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
fd50: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69  r+4 ){.        i
fd60: 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  f( iFreeBlk==0 )
fd70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fd80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fd90: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
fda0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
fdb0: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
fdc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fdd0: 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e  iFreeBlk>pPage->
fde0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
fdf0: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
fe00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fe10: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
fe20: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
fe30: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
fe40: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
fe50: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
fe60: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
fe70: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
fe80: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
fe90: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
fea0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
feb0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
fec0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
fed0: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
fee0: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
fef0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
ff00: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
ff10: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
ff20: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
ff30: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
ff40: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
ff50: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
ff60: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
ff70: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
ff80: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
ff90: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
ffa0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ffb0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ffc0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64  age);.      iEnd
ffd0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65   = iFreeBlk + ge
ffe0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
fff0: 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20  eeBlk+2]);.     
10000 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67   if( iEnd > pPag
10010 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
10020 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ze ){.        re
10030 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10040 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10060 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
10070 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
10080 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
10090 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
100a0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
100b0 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
100c0 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
100d0 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
100e0 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
100f0 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
10100 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
10110 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
10120 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
10130 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
10140 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
10150 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
10160 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
10170 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
10180 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
10190 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
101a0 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
101b0 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
101c0 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
101d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
101e0 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
101f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10200 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10210 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  ge);.        nFr
10220 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
10230 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
10240 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
10250 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
10260 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
10270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10280 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
10290 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
102a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
102b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74  (pPage);.    dat
102c0 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
102d0 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74  g;.  }.  x = get
102e0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
102f0 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72  5]);.  if( iStar
10300 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54  t<=x ){.    /* T
10310 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
10320 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
10330 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
10340 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
10350 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
10360 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
10370 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
10380 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
10390 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
103a0 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
103b0 20 20 20 69 66 28 20 69 53 74 61 72 74 3c 78 20     if( iStart<x 
103c0 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  || iPtr!=hdr+1 )
103d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
103e0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
103f0 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
10400 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
10410 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
10420 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
10430 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
10440 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
10450 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
10460 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
10470 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
10480 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
10490 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d  r], iStart);.  }
104a0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
104b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
104c0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
104d0 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
104e0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
104f0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
10500 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
10510 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f  _delete.    ** o
10520 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
10530 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
10540 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
10550 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70   iSize);.  }.  p
10560 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
10570 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
10580 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
10590 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
105a0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
105b0 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
105c0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
105d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
105e0 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
105f0 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
10600 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
10610 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
10620 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
10630 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
10640 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
10650 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
10660 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
10670 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
10680 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
10690 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
106a0 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
106b0 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
106c0 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
106d0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
106e0 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
106f0 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
10700 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
10710 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
10720 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
10730 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
10740 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
10750 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
10760 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
10770 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
10780 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
10790 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
107a0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
107b0 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
107c0 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
107d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
107e0 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
107f0 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
10800 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
10810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10820 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
10830 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
10840 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
10850 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
10860 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
10870 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
10880 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
10890 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
108a0 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
108b0 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
108c0 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
108d0 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
108e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
108f0 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
10900 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
10910 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
10920 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
10930 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
10940 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
10950 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
10960 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
10970 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
10980 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
10990 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
109a0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
109b0 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
109c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
109d0 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
109e0 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
109f0 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
10a00 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
10a10 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
10a20 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
10a30 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
10a40 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
10a50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
10a60 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
10a70 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
10a80 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
10a90 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
10aa0 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
10ab0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
10ac0 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
10ad0 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
10ae0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
10af0 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
10b00 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
10b10 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
10b20 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
10b30 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
10b40 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
10b50 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
10b60 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
10b70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
10b80 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
10b90 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
10ba0 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
10bb0 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
10bc0 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
10bd0 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
10be0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
10bf0 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
10c00 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
10c10 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
10c20 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
10c30 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
10c40 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
10c50 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
10c60 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
10c70 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10c80 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
10c90 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
10ca0 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
10cb0 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
10cc0 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
10cd0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
10ce0 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
10cf0 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
10d00 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
10d10 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
10d20 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
10d30 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
10d40 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
10d50 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
10d60 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
10d70 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
10d80 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
10d90 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
10da0 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
10db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
10dc0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
10dd0 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
10de0 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
10df0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
10e00 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
10e10 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
10e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10e30 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10e40 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
10e50 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
10e60 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
10e70 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
10e80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10e90 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
10ea0 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
10eb0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
10ec0 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
10ed0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10ee0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
10ef0 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
10f00 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
10f10 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
10f20 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
10f30 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
10f40 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
10f50 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
10f60 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
10f70 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
10f80 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
10f90 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
10fa0 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
10fb0 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
10fc0 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
10fd0 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
10fe0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
10ff0 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
11000 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11010 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  e){.  int pc;   
11020 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11030 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
11040 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
11050 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  >aData[] */.  u8
11060 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
11070 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
11080 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
11090 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
110a0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
110b0 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
110c0 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
110d0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
110e0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
110f0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
11100 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
11110 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
11120 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
11130 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
11140 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65  .  u16 cellOffse
11150 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
11160 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
11170 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
11180 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
11190 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
111a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
111b0 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
111c0 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
111d0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
111e0 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
111f0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
11200 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
11210 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
11220 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
11230 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
11240 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
11250 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
11260 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
11270 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
11280 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
11290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
112a0 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
112b0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
112c0 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
112d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
112e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
112f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11300 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
11310 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
11320 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
11330 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
11340 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
11350 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11360 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
11370 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
11380 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
11390 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
113a0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
113b0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
113c0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
113d0 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d  t==0 );..  pBt =
113e0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68   pPage->pBt;.  h
113f0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
11400 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
11410 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
11420 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
11430 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68  R-28594-02890 Th
11440 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20  e one-byte flag 
11450 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69  at offset 0 indi
11460 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  cating.  ** the 
11470 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
11480 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64  . */.  if( decod
11490 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
114a0 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20  ta[hdr]) ){.    
114b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
114c0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
114d0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
114e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
114f0 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
11500 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
11510 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
11520 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
11530 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
11540 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11550 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
11560 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
11570 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
11580 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
11590 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
115a0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
115b0 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  rSize;.  pPage->
115c0 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
115d0 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
115e0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
115f0 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
11600 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  et];.  pPage->aD
11610 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b  ataOfst = &data[
11620 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
11630 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45  ize];.  /* EVIDE
11640 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d  NCE-OF: R-58015-
11650 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79  48175 The two-by
11660 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
11670 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65  fset 5 designate
11680 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  s.  ** the start
11690 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
116a0 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72  tent area. A zer
116b0 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  o value for this
116c0 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 2a 2a   integer is.  **
116d0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
116e0 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20  65536. */.  top 
116f0 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
11700 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
11710 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
11720 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
11730 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
11740 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
11750 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  3 gives the.  **
11760 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
11770 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
11780 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
11790 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
117a0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
117b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
117c0 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
117d0 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
117e0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
117f0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
11800 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
11810 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
11820 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
11830 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74  (pPage);.  }.  t
11840 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
11850 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
11860 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  Bt) );.  /* EVID
11870 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
11880 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
11890 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
118a0 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
118b0 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  y.  ** possible 
118c0 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20  for a root page 
118d0 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
118e0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73  contains no rows
118f0 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  ) then the.  ** 
11900 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
11910 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
11920 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
11930 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
11940 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  he.  ** bytes of
11950 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
11960 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
11970 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
11980 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
11990 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
119a0 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d  ..  /* A malform
119b0 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
119c0 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
119d0 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
119e0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67   end.  ** of pag
119f0 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
11a00 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20   cell.  .  **.  
11a10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
11a20 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
11a30 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
11a40 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
11a50 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74  ends.  ** past t
11a60 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
11a70 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
11a80 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
11a90 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  UPT to be .  ** 
11aa0 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
11ab0 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c  oes..  */.  iCel
11ac0 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
11ad0 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
11ae0 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
11af0 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
11b00 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64   4;.  if( pBt->d
11b10 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
11b20 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a  E_CellSizeCk ){.
11b30 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
11b40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
11b50 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
11b60 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
11b70 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
11b80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
11b90 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66   cell */..    if
11ba0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
11bb0 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
11bc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
11bd0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
11be0 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32  .      pc = get2
11bf0 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74  byteAligned(&dat
11c00 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
11c10 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ]);.      testca
11c20 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
11c30 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  st );.      test
11c40 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
11c50 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ast );.      if(
11c60 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
11c70 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
11c80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11c90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11ca0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
11cb0 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20     }.      sz = 
11cc0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
11cd0 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
11ce0 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ]);.      testca
11cf0 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
11d00 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
11d10 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
11d20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11d40 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
11d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11d60 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
11d70 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
11d80 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  ++;.  }  ..  /* 
11d90 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
11da0 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
11db0 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56  the page.  ** EV
11dc0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
11dd0 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
11de0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
11df0 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
11e00 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f  the.  ** start o
11e10 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
11e20 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
11e30 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
11e40 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
11e50 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a  ** freeblocks. *
11e60 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
11e70 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
11e80 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
11e90 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
11ea0 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
11eb0 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
11ec0 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66  ee space */.  if
11ed0 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33  ( pc>0 ){.    u3
11ee0 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  2 next, size;.  
11ef0 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
11f00 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rst ){.      /* 
11f10 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
11f20 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20  5530-52930 In a 
11f30 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
11f40 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77  ee page, there w
11f50 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77  ill.      ** alw
11f60 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
11f70 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
11f80 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
11f90 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
11fa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11fb0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
11fc0 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20  Page); .    }.  
11fd0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
11fe0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
11ff0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
12000 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
12010 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
12020 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
12030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12040 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
12050 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12060 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
12070 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
12080 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
12090 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
120a0 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
120b0 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
120c0 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
120d0 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
120e0 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
120f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
12100 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  ext>0 ){.      /
12110 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20  * Freeblock not 
12120 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
12130 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
12140 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12150 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
12160 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b     }.    if( pc+
12170 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69  size>(unsigned i
12180 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  nt)usableSize ){
12190 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66  .      /* Last f
121a0 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73  reeblock extends
121b0 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a   past page end *
121c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
121d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
121e0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
121f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
12200 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
12210 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
12220 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
12230 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
12240 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
12250 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
12260 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
12270 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
12280 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
12290 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
122a0 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
122b0 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
122c0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ze.  ** of the p
122d0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
122e0 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
122f0 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
12300 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65   also.  ** serve
12310 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
12320 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
12330 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
12340 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a  cell-content.  *
12350 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
12360 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
12370 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
12380 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f  n the page..  */
12390 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61  .  if( nFree>usa
123a0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  bleSize ){.    r
123b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
123c0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
123d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
123e0 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
123f0 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
12400 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
12410 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
12420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12430 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
12440 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
12450 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
12460 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
12470 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
12480 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12490 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
124a0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
124b0 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
124c0 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
124d0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
124e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
124f0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
12500 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
12510 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
12520 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
12530 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12540 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
12550 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
12560 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
12570 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12580 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
12590 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
125a0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
125b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
125c0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
125d0 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
125e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
125f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
12600 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
12610 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
12620 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12630 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12640 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
12650 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
12660 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20  T_SECURE ){.    
12670 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
12680 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
12690 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
126a0 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
126b0 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
126c0 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
126d0 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
126e0 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
126f0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
12700 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
12710 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
12720 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
12730 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
12740 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
12750 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
12760 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
12770 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
12780 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
12790 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
127a0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
127b0 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
127c0 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
127d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
127e0 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
127f0 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
12800 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
12810 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
12820 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
12830 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
12840 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
12850 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
12860 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
12870 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
12880 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
12890 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
128a0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
128b0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
128c0 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
128d0 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
128e0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
128f0 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
12900 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
12910 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
12920 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
12930 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
12940 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
12950 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
12960 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
12970 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
12980 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
12990 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
129a0 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
129b0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
129c0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e  Page);.  if( pgn
129d0 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  o!=pPage->pgno )
129e0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  {.    pPage->aDa
129f0 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
12a00 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
12a10 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44  );.    pPage->pD
12a20 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
12a30 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20  .    pPage->pBt 
12a40 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65  = pBt;.    pPage
12a50 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
12a60 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66     pPage->hdrOff
12a70 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
12a80 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61  100 : 0;.  }.  a
12a90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
12aa0 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
12ab0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
12ac0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ) );.  return pP
12ad0 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
12ae0 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
12af0 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
12b00 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
12b10 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
12b20 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
12b30 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
12b40 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
12b50 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
12b60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
12b70 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
12b80 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
12b90 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
12ba0 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
12bb0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
12bc0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
12bd0 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
12be0 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
12bf0 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
12c00 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
12c10 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
12c20 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
12c30 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
12c40 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
12c50 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
12c60 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
12c70 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
12c80 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
12c90 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
12ca0 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
12cb0 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
12cc0 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
12cd0 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
12ce0 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
12cf0 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
12d00 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12d10 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
12d20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
12d30 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12d40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
12d50 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
12d60 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
12d70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
12d80 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
12d90 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
12da0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
12db0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
12dc0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
12dd0 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
12de0 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
12df0 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
12e00 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
12e10 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
12e20 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
12e30 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
12e40 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
12e50 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
12e60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12e70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
12e80 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
12e90 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
12ea0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
12eb0 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
12ec0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
12ed0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12ee0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
12ef0 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
12f00 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
12f10 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
12f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12f30 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
12f40 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
12f50 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
12f60 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
12f70 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
12f80 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
12f90 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
12fa0 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
12fb0 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
12fc0 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
12fd0 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
12fe0 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
12ff0 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
13000 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
13010 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
13020 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
13030 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
13040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13050 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
13060 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
13070 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
13080 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
13090 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
130a0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
130b0 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
130c0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
130d0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
130e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
130f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
13100 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
13110 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
13120 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
13130 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
13140 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
13150 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
13160 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
13170 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
13180 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
13190 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
131a0 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
131b0 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
131c0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
131d0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
131e0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
131f0 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
13200 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
13210 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
13220 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
13230 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
13240 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
13250 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
13260 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
13270 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75  it..**.** If pCu
13280 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  r!=0 then the pa
13290 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63  ge is being fetc
132a0 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  hed as part of a
132b0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a   moveToChild().*
132c0 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69  * call.  Do addi
132d0 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  tional sanity ch
132e0 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
132f0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
13300 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66  .** And if the f
13310 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73  etch fails, this
13320 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65   routine must de
13330 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50  crement pCur->iP
13340 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
13350 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61  age is fetched a
13360 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c  s read-write unl
13370 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20  ess pCur is not 
13380 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61  NULL and is.** a
13390 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
133a0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
133b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
133c0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64  n *ppPage is und
133d0 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
133e0 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
133f0 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
13400 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
13410 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
13420 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
13430 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
13440 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
13450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
13470 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
134a0 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
134b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
134c0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
134d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
134e0 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
134f0 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  here */.  BtCurs
13500 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
13510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
13520 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74  sor to receive t
13530 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c  he page, or NULL
13540 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f   */.  int bReadO
13550 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
13560 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
13570 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61  r a read-only pa
13580 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
13590 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
135a0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
135b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
135c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
135d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
135e0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26  ==0 || ppPage==&
135f0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
13600 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
13610 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70   || bReadOnly==p
13620 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
13630 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gs );.  assert( 
13640 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  pCur==0 || pCur-
13650 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69  >iPage>0 );..  i
13660 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67  f( pgno>btreePag
13670 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
13680 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13690 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
136a0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
136b0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
136c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
136d0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
136e0 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
136f0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52  e**)&pDbPage, bR
13700 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20  eadOnly);.  if( 
13710 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67  rc ){.    goto g
13720 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13730 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  ror;.  }.  *ppPa
13740 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
13750 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
13760 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
13770 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69  if( (*ppPage)->i
13780 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
13790 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
137a0 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
137b0 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20  o, pBt);.    rc 
137c0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
137d0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  *ppPage);.    if
137e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137f0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
13800 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
13810 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64       goto getAnd
13820 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
13830 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
13840 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
13850 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
13860 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
13870 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33  ->aData==sqlite3
13880 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
13890 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Page) );..  /* I
138a0 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68  f obtaining a ch
138b0 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20 63  ild page for a c
138c0 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76  ursor, we must v
138d0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70  erify that the p
138e0 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  age is.  ** comp
138f0 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
13900 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  root page. */.  
13910 69 66 28 20 70 43 75 72 20 26 26 20 28 28 2a 70  if( pCur && ((*p
13920 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20  pPage)->nCell<1 
13930 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e  || (*ppPage)->in
13940 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49  tKey!=pCur->curI
13950 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63  ntKey) ){.    rc
13960 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
13970 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20  T_PGNO(pgno);.  
13980 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
13990 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f  pPage);.    goto
139a0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
139b0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  error;.  }.  ret
139c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
139d0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
139e0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72  rror:.  if( pCur
139f0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50   ){.    pCur->iP
13a00 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d  age--;.    pCur-
13a10 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
13a20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
13a30 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  e];.  }.  testca
13a40 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
13a50 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
13a60 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
13a70 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
13a80 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
13a90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
13aa0 4e 43 55 52 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20  NCURRENT./* .** 
13ab0 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
13ac0 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 67 6e   the MemPage.pgn
13ad0 6f 52 6f 6f 74 20 76 61 72 69 61 62 6c 65 2c 20  oRoot variable, 
13ae0 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2f  if it exists..*/
13af0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13b00 4d 65 6d 70 61 67 65 52 6f 6f 74 28 4d 65 6d 50  MempageRoot(MemP
13b10 61 67 65 20 2a 70 50 67 2c 20 75 33 32 20 70 67  age *pPg, u32 pg
13b20 6e 6f 52 6f 6f 74 29 7b 0a 20 20 70 50 67 2d 3e  noRoot){.  pPg->
13b30 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 67 6e 6f 52  pgnoRoot = pgnoR
13b40 6f 6f 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  oot;.}.#else.# d
13b50 65 66 69 6e 65 20 73 65 74 4d 65 6d 70 61 67 65  efine setMempage
13b60 52 6f 6f 74 28 78 2c 79 29 0a 23 65 6e 64 69 66  Root(x,y).#endif
13b70 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
13b80 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
13b90 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
13ba0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
13bb0 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
13bc0 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
13bd0 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20  *.** Page1 is a 
13be0 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64  special case and
13bf0 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
13c00 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50  d using releaseP
13c10 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61  ageOne()..*/.sta
13c20 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
13c30 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
13c40 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
13c50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
13c60 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
13c70 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
13c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
13c90 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
13ca0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13cb0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
13cc0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
13cd0 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
13ce0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13cf0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
13d00 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
13d10 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
13d20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13d30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
13d40 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
13d50 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
13d60 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
13d70 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
13d80 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
13d90 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
13da0 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
13db0 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
13dc0 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
13dd0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13de0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
13df0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
13e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
13e10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13e20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
13e30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
13e40 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
13e50 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
13e60 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13e70 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
13e80 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
13e90 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
13ea0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
13eb0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
13ec0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
13ed0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
13ee0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
13ef0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13f00 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
13f10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
13f20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
13f30 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62  geOne(pPage->pDb
13f40 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
13f50 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
13f60 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
13f70 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
13f80 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
13f90 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
13fa0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
13fb0 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
13fc0 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
13fd0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
13fe0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
13ff0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
14000 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
14010 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
14020 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
14030 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
14040 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
14050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
14060 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
14070 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
14080 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
14090 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
140a0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
140b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
140c0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
140d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
140e0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
140f0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
14100 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
14110 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
14120 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
14130 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
14140 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
14150 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
14160 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
14170 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
14180 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
14190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
141a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
141b0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
141c0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
141d0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
141e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
141f0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
14200 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
14210 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14220 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
14230 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
14240 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
14250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
14260 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
14270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
14280 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
14290 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
142a0 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
142b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
142c0 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
142d0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
142e0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
142f0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
14300 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
14310 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
14320 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
14330 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
14340 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14350 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
14360 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
14370 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
14380 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
14390 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
143a0 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
143b0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
143c0 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
143d0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
143e0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
143f0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
14400 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
14410 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
14420 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
14430 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
14440 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
14450 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
14460 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
14470 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
14480 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14490 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
144a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
144b0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
144c0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
144d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
144e0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
144f0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
14500 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
14510 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
14520 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
14530 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
14540 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
14550 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
14560 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
14570 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
14580 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
14590 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
145a0 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
145b0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
145c0 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
145d0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
145e0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
145f0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
14600 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
14610 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
14620 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
14630 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
14640 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
14650 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
14660 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
14670 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
14680 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
14690 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
146a0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
146b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
146c0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
146d0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
146e0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
146f0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
14700 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
14710 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
14720 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
14730 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
14740 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
14750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14760 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
14770 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
14780 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
14790 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
147a0 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
147b0 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20  Handler,.       
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
147e0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
147f0 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a  >pPager));.}../*
14800 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
14810 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
14820 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
14830 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
14840 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
14850 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
14860 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
14870 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
14880 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
14890 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
148a0 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
148b0 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
148c0 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
148d0 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
148e0 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
148f0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
14900 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
14910 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
14920 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
14930 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
14940 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
14950 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
14960 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
14970 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
14980 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
14990 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
149a0 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
149b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
149c0 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
149d0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
149e0 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
149f0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
14a00 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
14a10 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
14a20 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
14a30 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
14a40 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
14a50 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
14a60 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
14a70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
14a80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14a90 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
14aa0 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
14ab0 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
14ac0 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
14ad0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
14ae0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
14af0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
14b00 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
14b10 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
14b20 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
14b30 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14b40 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
14b50 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
14b60 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
14b70 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
14b80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
14b90 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
14ba0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
14bb0 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
14bc0 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
14bd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
14be0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
14bf0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
14c00 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
14c10 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
14c20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
14c30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
14c40 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
14c50 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
14c60 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
14c70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
14c80 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
14c90 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
14ca0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14cc0 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
14cd0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
14ce0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
14cf0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
14d00 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
14d10 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
14d20 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
14d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
14d40 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
14d50 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
14d60 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
14d90 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
14da0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
14db0 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
14dc0 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
14dd0 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
14de0 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
14df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14e00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
14e10 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
14e20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
14e30 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e50 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
14e60 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
14e70 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
14e80 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
14e90 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
14ea0 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
14eb0 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
14ec0 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
14ed0 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
14ee0 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
14ef0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
14f00 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
14f10 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
14f20 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
14f30 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
14f40 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
14f50 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
14f60 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
14f70 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
14f80 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
14f90 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
14fa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
14fb0 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
14fc0 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
14fd0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
14fe0 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
14ff0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
15000 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
15010 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
15040 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
15050 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
15080 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
15090 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
150a0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
150b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
150c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
150d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
150e0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
150f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
15100 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
15110 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
15120 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
15130 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
15140 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
15150 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
15160 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
15170 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
15180 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
15190 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
151a0 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
151b0 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
151c0 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
151d0 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
151e0 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
151f0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
15200 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
15210 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
15220 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
15230 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
15240 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
15250 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
15260 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
15270 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
15280 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
15290 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
152a0 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
152b0 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
152c0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
152d0 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
152e0 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
152f0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
15300 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
15310 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
15320 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
15330 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15340 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
15350 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
15360 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
15370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15380 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15390 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
153a0 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
153b0 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
153c0 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
153d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
153e0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
153f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15400 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
15410 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
15420 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
15430 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
15440 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
15450 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
15460 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
15470 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
15480 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
15490 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
154a0 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
154b0 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
154c0 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
154d0 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
154e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
154f0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
15500 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
15510 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
15520 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
15530 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
15540 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
15550 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
15560 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
15570 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
15580 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
15590 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
155a0 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
155b0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
155c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
155d0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
155e0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
155f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
15600 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
15610 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15620 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
15630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15640 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
15650 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
15660 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
15670 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
15680 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
15690 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
156a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
156b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
156c0 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
156d0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
15710 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
15720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
15740 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
15750 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
15760 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15770 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
15780 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
157a0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
157b0 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
157c0 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
157d0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
157e0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
157f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15800 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
15810 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
15820 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
15830 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
15840 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
15850 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
15860 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15870 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
15880 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
15890 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
158a0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
158b0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
158c0 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
158d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
158e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
158f0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
15900 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
15910 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
15920 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
15930 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
15940 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
15950 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
15960 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
15970 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
15980 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
15990 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
159a0 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
159b0 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
159c0 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
159d0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
159e0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
159f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
15a00 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
15a10 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
15a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15a30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a40 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
15a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15a60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a70 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15a90 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
15aa0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
15ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15ac0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
15ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15ae0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
15af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
15b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15b10 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
15b20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
15b30 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
15b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15b50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15b60 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15b70 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
15b80 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
15b90 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
15ba0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
15bb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
15bc0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
15bd0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
15be0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
15bf0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
15c00 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
15c10 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
15c20 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
15c30 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
15c40 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
15c50 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
15c60 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
15c70 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
15c80 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
15c90 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
15ca0 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
15cb0 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
15cc0 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
15cd0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
15ce0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
15cf0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
15d00 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
15d10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
15d20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
15d30 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
15d40 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
15d50 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
15d60 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
15d70 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
15d80 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
15d90 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
15da0 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
15db0 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
15dc0 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
15dd0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
15de0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15df0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
15e00 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
15e10 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
15e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
15e30 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
15e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15e50 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
15e60 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15e70 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
15e80 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
15e90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
15ea0 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
15eb0 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
15ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15ed0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15ee0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
15ef0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
15f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15f10 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
15f20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
15f30 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f50 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65    sizeof(MemPage
15f60 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  ), flags, vfsFla
15f70 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
15f80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15fa0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
15fb0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
15fc0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
15fd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15fe0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
15ff0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
16000 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
16010 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
16020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16040 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
16050 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
16060 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
16070 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
16080 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
16090 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
160a0 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
160b0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
160c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
160d0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
160e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
160f0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
16100 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
16110 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
16120 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
16130 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
16140 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
16150 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16160 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
16170 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
16180 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
16190 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
161a0 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
161b0 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66  ELETE;.#elif def
161c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54  ined(SQLITE_FAST
161d0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
161e0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
161f0 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49  s |= BTS_OVERWRI
16200 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
16210 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16220 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
16230 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
16240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
16250 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
16260 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
16270 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
16280 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
16290 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
162a0 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
162b0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
162c0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
162d0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
162e0 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
162f0 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
16300 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
16310 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
16320 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
16330 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
16340 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
16350 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
16360 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
16370 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
16380 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
16390 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
163a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
163b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
163c0 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
163d0 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
163e0 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
163f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
16400 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
16410 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
16420 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
16430 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
16440 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
16450 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
16460 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
16470 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
16480 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
16490 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
164a0 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
164b0 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
164c0 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
164d0 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
164e0 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
164f0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
16500 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
16510 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
16520 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
16530 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
16540 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
16550 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
16560 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
16570 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
16580 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
16590 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
165a0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
165b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
165c0 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
165d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
165e0 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
165f0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
16600 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
16610 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
16620 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
16630 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
16640 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
16650 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
16660 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
16670 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
16680 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
16690 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
166a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
166b0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
166c0 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
166d0 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
166e0 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
166f0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
16700 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
16710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16720 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
16730 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
16740 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
16750 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
16760 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
16770 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
16780 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
16790 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
167a0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
167b0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
167c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
167d0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
167e0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
167f0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
16800 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
16810 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
16820 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
16830 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
16840 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
16850 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
16860 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
16870 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
16880 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
16890 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
168a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
168b0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
168c0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
168d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
168e0 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
168f0 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
16900 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
16910 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
16920 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
16930 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
16940 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
16950 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
16960 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
16970 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
16980 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
16990 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
169a0 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
169b0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
169c0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
169d0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
169e0 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
169f0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
16a00 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
16a10 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
16a20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
16a30 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
16a40 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
16a50 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
16a60 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
16a70 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
16a80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16a90 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
16aa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
16ab0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
16ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16ad0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
16ae0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
16af0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
16b00 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
16b10 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
16b20 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
16b30 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
16b40 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
16b50 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
16b60 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
16b70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16b80 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
16b90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16ba0 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
16bb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
16bc0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
16bd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16be0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
16bf0 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
16c00 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
16c10 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
16c20 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
16c30 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
16c40 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
16c50 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
16c60 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
16c70 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
16c80 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
16c90 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
16ca0 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
16cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
16cc0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
16cd0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
16ce0 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
16cf0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
16d00 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
16d10 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
16d20 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
16d30 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
16d40 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
16d50 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
16d60 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
16d70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
16d80 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
16d90 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
16da0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
16db0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
16dc0 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
16dd0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
16de0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
16df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e00 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
16e10 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
16e20 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
16e30 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
16e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
16e50 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
16e60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16e70 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
16e80 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
16e90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
16ea0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
16eb0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
16ec0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16ed0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
16ee0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
16ef0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
16f00 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
16f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
16f20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16f30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
16f40 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
16f50 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
16f60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
16f80 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
16f90 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
16fa0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
16fb0 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
16fc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
16fd0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
16fe0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16ff0 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
17000 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
17010 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
17020 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  le;..    /* If t
17030 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
17040 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
17050 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
17060 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
17070 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
17080 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
17090 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
170a0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
170b0 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
170c0 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
170d0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
170e0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
170f0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
17100 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
17110 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
17120 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
17130 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
17140 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
17150 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
17160 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _SIZE);.    }.. 
17170 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74     pFile = sqlit
17180 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
17190 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
171a0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
171b0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
171c0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
171d0 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
171e0 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f  E_FCNTL_PDB, (vo
171f0 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20  id*)&pBt->db);. 
17200 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
17210 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
17220 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17230 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
17240 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
17250 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
17260 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
17270 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
17280 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
17290 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
172a0 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
172b0 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
172c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
172d0 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
172e0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
172f0 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
17300 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
17310 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
17320 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
17330 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
17340 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
17350 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
17360 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
17370 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
17380 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
17390 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
173a0 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
173b0 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
173c0 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
173d0 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
173e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
173f0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
17400 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
17410 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
17420 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
17430 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
17440 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
17450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17460 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
17470 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
17480 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
17490 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
174a0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
174b0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
174c0 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
174d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
174e0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
174f0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
17500 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
17510 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
17520 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
17530 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
17540 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
17550 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
17560 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
17570 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
17580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17590 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
175a0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
175b0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
175c0 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
175d0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
175e0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
175f0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
17600 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
17610 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
17620 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
17630 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
17640 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
17650 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
17660 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
17670 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
17680 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17690 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
176a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
176b0 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
176c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
176d0 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
176e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
176f0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
17700 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
17710 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
17720 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
17730 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
17740 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
17750 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
17760 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
17770 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
17780 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
17790 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
177a0 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
177b0 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
177c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
177d0 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
177e0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
177f0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
17800 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
17810 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
17820 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
17830 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
17840 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
17850 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
17860 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
17870 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
17880 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
17890 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
178a0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
178b0 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
178c0 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
178d0 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
178e0 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
178f0 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
17900 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
17910 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
17920 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
17930 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
17940 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
17950 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
17960 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
17970 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
17980 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
17990 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
179a0 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
179b0 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
179c0 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
179d0 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
179e0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
179f0 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
17a00 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
17a10 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
17a20 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
17a30 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
17a40 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
17a50 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
17a60 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
17a70 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
17a80 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
17a90 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
17aa0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
17ab0 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
17ac0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17ad0 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
17ae0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
17af0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
17b00 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
17b10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
17b20 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
17b30 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
17b40 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
17b50 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
17b60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
17b70 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
17b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17b90 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
17ba0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
17bb0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
17bc0 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
17bd0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
17be0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
17bf0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
17c00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
17c10 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
17c20 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
17c30 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
17c40 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
17c50 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
17c60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
17c70 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
17c80 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
17c90 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
17ca0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
17cb0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
17cc0 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
17cd0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
17ce0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
17cf0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
17d00 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
17d10 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
17d20 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17d30 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17d40 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
17d50 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
17d60 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
17d70 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
17d80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17d90 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17da0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17db0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
17dc0 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
17dd0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
17de0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
17df0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
17e00 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
17e10 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
17e20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
17e30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17e40 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
17e50 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
17e60 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
17e70 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
17e80 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
17e90 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
17ea0 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
17eb0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
17ec0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
17ed0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
17ee0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
17ef0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
17f00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
17f10 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
17f20 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
17f30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17f40 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
17f50 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
17f60 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
17f70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
17f80 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
17f90 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
17fa0 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
17fb0 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
17fc0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
17fd0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
17fe0 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
17ff0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
18000 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
18010 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
18020 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
18030 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
18040 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
18050 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
18060 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
18070 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
18080 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
18090 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
180a0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
180b0 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
180c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
180d0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
180e0 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
180f0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
18100 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
18110 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
18120 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
18130 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
18140 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28   p->db);.    if(
18150 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
18160 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
18170 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
18180 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
18190 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
181a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
181b0 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
181c0 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
181d0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
181e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
181f0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
18200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
18210 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
18220 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
18230 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
18240 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
18250 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
18260 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
18270 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
18280 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
18290 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
182a0 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
182b0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
182c0 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
182d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
182e0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
182f0 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74  soft" limit on t
18300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18310 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
18320 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75  .** Unused and u
18330 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20  nmodified pages 
18340 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64  will be recycled
18350 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
18360 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20   of.** pages in 
18370 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64  the cache exceed
18380 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69  s this soft limi
18390 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65  t.  But the size
183a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65   of the.** cache
183b0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67   is allowed to g
183c0 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20  row larger than 
183d0 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74  this limit if it
183e0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72   contains.** dir
183f0 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65  ty pages or page
18400 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76  s still in activ
18410 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e use..*/.int sq
18420 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
18430 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
18440 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
18450 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18460 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
18470 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18480 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
18490 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
184a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
184b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
184c0 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
184d0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
184e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
184f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18510 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
18520 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20  spill" limit on 
18530 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
18540 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
18550 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  ..** If the numb
18560 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65  er of pages exce
18570 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64  eds this limit d
18580 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  uring a write tr
18590 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68  ansaction,.** th
185a0 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74  e pager might at
185b0 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22  tempt to "spill"
185c0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f   pages to the jo
185d0 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a  urnal early in.*
185e0 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  * order to free 
185f0 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  up memory..**.**
18600 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
18610 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65  ned is the curre
18620 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20  nt spill size.  
18630 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65  If zero is passe
18640 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  d.** as an argum
18650 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
18660 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
18670 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69  spill size setti
18680 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20  ng, so.** using 
18690 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61  mxPage of 0 is a
186a0 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68   way to query th
186b0 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
186c0 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  size..*/.int sql
186d0 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
186e0 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  lSize(Btree *p, 
186f0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
18700 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18710 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73  ->pBt;.  int res
18720 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
18730 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18740 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
18750 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18760 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20  ter(p);.  res = 
18770 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
18780 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50  pillsize(pBt->pP
18790 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
187a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
187b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
187c0 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  res;.}..#if SQLI
187d0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
187e0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
187f0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
18800 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
18810 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
18820 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
18830 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
18840 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18850 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
18860 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
18870 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
18880 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18890 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
188a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
188b0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
188c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
188d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
188e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
188f0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
18900 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
18910 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18920 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
18930 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
18940 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
18950 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
18960 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
18970 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
18980 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
18990 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
189a0 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
189b0 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
189c0 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
189d0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
189e0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
189f0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
18a00 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
18a10 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
18a20 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
18a30 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
18a40 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
18a50 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
18a60 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
18a70 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
18a80 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
18a90 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
18aa0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
18ab0 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
18ac0 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
18ad0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
18ae0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
18af0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
18b00 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
18b10 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
18b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18b30 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
18b40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18b50 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
18b60 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
18b70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
18b80 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
18b90 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
18ba0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
18bb0 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
18bc0 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
18bd0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
18be0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18bf0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
18c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18c10 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
18c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18c30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
18c40 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
18c50 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
18c60 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
18c70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18c80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18c90 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
18ca0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
18cb0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
18cc0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
18cd0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
18ce0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
18cf0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
18d00 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
18d10 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
18d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
18d30 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
18d40 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
18d50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
18d60 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
18d70 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
18d80 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
18d90 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
18da0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
18db0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
18dc0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
18dd0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
18de0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
18df0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
18e00 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
18e10 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
18e20 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
18e30 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
18e40 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
18e50 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
18e60 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
18e70 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
18e80 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
18e90 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
18ea0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
18eb0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
18ec0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
18ed0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
18ee0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
18ef0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
18f00 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
18f10 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
18f20 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
18f30 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
18f40 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
18f50 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
18f60 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
18f70 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
18f80 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
18f90 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
18fa0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
18fb0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
18fc0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
18fd0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
18fe0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18ff0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
19000 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
19010 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
19020 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
19030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19040 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19050 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
19060 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
19070 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
19080 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
19090 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
190a0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
190b0 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
190c0 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
190d0 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
190e0 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
190f0 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
19100 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
19110 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
19120 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
19130 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19140 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
19150 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
19160 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
19170 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
19180 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
19190 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
191a0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
191b0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
191c0 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
191d0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
191e0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
191f0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
19200 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
19210 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
19220 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
19230 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
19240 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
19250 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
19260 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
19270 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
19280 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
19290 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
192a0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
192b0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
192c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
192d0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
192e0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
192f0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
19300 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19310 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
19320 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
19330 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
19340 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
19350 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
19360 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
19370 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19380 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19390 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
193a0 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
193b0 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
193c0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
193d0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
193e0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
193f0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
19400 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19410 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
19420 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
19430 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
19440 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
19450 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
19460 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
19470 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
19480 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
19490 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
194a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
194b0 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
194c0 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
194d0 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
194e0 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
194f0 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
19500 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
19510 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
19520 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
19530 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
19540 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
19550 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
19560 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
19570 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
19580 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
19590 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
195a0 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
195b0 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
195c0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
195d0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
195e0 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
195f0 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
19600 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19610 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
19620 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
19630 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
19640 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19650 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
19660 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
19670 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
19680 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
19690 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
196a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
196b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
196c0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
196d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
196e0 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
196f0 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
19700 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
19710 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
19720 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
19730 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
19740 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
19750 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
19760 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
19770 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
19780 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
19790 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
197a0 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
197b0 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
197c0 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
197d0 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
197e0 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
197f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19800 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
19810 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
19820 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
19830 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19840 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
19850 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
19860 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
19870 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19880 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
19890 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
198a0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
198b0 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
198c0 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
198d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
198e0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
198f0 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
19900 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
19910 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
19920 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
19930 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
19940 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
19950 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
19960 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
19970 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
19980 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
19990 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
199a0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
199b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
199c0 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
199d0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
199e0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
199f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19a00 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
19a10 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
19a20 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
19a30 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
19a40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19a50 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
19a60 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
19a70 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
19a80 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
19a90 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
19aa0 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  RITE flags:.**.*
19ab0 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20  *    newFlag==0 
19ac0 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53        Both BTS_S
19ad0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
19ae0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61   BTS_OVERWRITE a
19af0 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  re cleared.**   
19b00 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20   newFlag==1     
19b10 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
19b20 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f  ETE set and BTS_
19b30 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65  OVERWRITE is cle
19b40 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
19b50 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f  ag==2       BTS_
19b60 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c  SECURE_DELETE cl
19b70 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56  eared and BTS_OV
19b80 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a  ERWRITE is set.*
19b90 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d  *    newFlag==(-
19ba0 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73  1)    No changes
19bb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19bc0 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75  ine acts as a qu
19bd0 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69  ery if newFlag i
19be0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
19bf0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
19c00 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64  OVERWRITE set, d
19c10 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
19c20 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  s overwritten by
19c30 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66   zeros, but.** f
19c40 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
19c50 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74  es are not writt
19c60 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
19c70 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69  atabase.  Thus i
19c80 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65  n-page.** delete
19c90 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65  d content is cle
19ca0 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69  ared, but freeli
19cb0 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  st deleted conte
19cc0 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  nt is not..**.**
19cd0 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45   With BTS_SECURE
19ce0 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69  _DELETE, operati
19cf0 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f  on is like BTS_O
19d00 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68  VERWRITE with th
19d10 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68  e addition.** th
19d20 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  at freelist leaf
19d30 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
19d40 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
19d50 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65   database, incre
19d60 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f  asing.** the amo
19d70 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e  unt of disk I/O.
19d80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19d90 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
19da0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
19db0 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
19dc0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
19dd0 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
19de0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19df0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f  .  assert( BTS_O
19e00 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45  VERWRITE==BTS_SE
19e10 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b  CURE_DELETE*2 );
19e20 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46  .  assert( BTS_F
19e30 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53  AST_SECURE==(BTS
19e40 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53  _OVERWRITE|BTS_S
19e50 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b  ECURE_DELETE) );
19e60 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
19e70 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
19e80 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
19e90 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20  S_FAST_SECURE;. 
19ea0 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
19eb0 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
19ec0 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67  E_DELETE*newFlag
19ed0 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e  ;.  }.  b = (p->
19ee0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19ef0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29  BTS_FAST_SECURE)
19f00 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  /BTS_SECURE_DELE
19f10 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  TE;.  sqlite3Btr
19f20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19f30 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
19f40 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
19f50 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
19f60 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
19f70 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
19f80 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
19f90 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
19fa0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
19fb0 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
19fc0 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
19fd0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
19fe0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
19ff0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
1a000 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
1a010 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
1a020 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
1a030 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
1a040 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
1a050 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
1a060 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
1a070 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
1a080 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
1a090 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a0a0 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
1a0b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
1a0c0 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
1a0d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
1a0e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a0f0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
1a100 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
1a110 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a120 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
1a130 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1a140 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
1a150 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
1a160 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
1a170 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1a180 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1a190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
1a1a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
1a1b0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
1a1c0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
1a1d0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
1a1e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a1f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a200 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
1a210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
1a220 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
1a230 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
1a240 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
1a250 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
1a260 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
1a270 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
1a280 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
1a290 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
1a2a0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
1a2b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1a2c0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
1a2d0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
1a2e0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
1a2f0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a300 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a310 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
1a320 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1a330 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
1a340 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
1a350 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
1a360 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
1a370 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
1a380 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
1a390 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
1a3a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
1a3c0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  dif.}../*.** If 
1a3d0 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74  the user has not
1a3e0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d   set the safety-
1a3f0 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64  level for this d
1a400 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a410 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41  on.** using "PRA
1a420 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22  GMA synchronous"
1a430 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66  , and if the saf
1a440 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74  ety-level is not
1a450 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
1a460 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
1a470 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1a480 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f  tion as the seco
1a490 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a  nd parameter,.**
1a4a0 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23   set it so..*/.#
1a4b0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
1a4c0 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
1a4d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
1a4e0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a  L_SYNCHRONOUS \.
1a4f0 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
1a500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
1a510 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1a520 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
1a530 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75  BtShared *pBt, u
1a540 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b  8 safety_level){
1a550 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1a560 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28    Db *pDb;.  if(
1a570 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
1a580 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
1a590 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  )!=0 ){.    whil
1a5a0 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
1a5b0 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
1a5c0 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
1a5d0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53  .    if( pDb->bS
1a5e0 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20  yncSet==0 .     
1a5f0 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
1a600 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76  evel!=safety_lev
1a610 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21  el .     && pDb!
1a620 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20  =&db->aDb[1] .  
1a630 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e    ){.      pDb->
1a640 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73  safety_level = s
1a650 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
1a660 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
1a670 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
1a680 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ger,.          p
1a690 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1a6a0 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1a6b0 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1a6c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
1a6d0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1a6e0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
1a6f0 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76  g(pBt,safety_lev
1a700 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  el).#endif../* F
1a710 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1a720 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
1a730 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
1a740 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  hared*);.../*.**
1a750 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
1a760 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
1a770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a780 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
1a790 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
1a7a0 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
1a7b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
1a7c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1a7d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
1a7e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1a7f0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
1a800 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
1a810 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
1a820 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
1a830 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
1a840 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1a850 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1a860 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
1a870 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
1a880 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
1a890 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
1a8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
1a8b0 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
1a8c0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a8e0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
1a8f0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
1a900 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
1a910 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
1a920 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
1a930 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1a940 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1a950 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1a960 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1a970 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
1a980 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
1a990 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1a9a0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1a9b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1a9c0 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
1a9d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1a9e0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1a9f0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
1aa00 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
1aa10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1aa20 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1aa30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1aa40 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
1aa50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1aa60 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
1aa70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
1aa80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aa90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1aaa0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1aab0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1aac0 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
1aad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1aae0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
1aaf0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
1ab00 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
1ab10 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
1ab20 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
1ab30 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
1ab40 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
1ab50 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
1ab60 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
1ab70 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
1ab80 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
1ab90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1aba0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1abb0 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
1abc0 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
1abd0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
1abe0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
1abf0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
1ac00 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
1ac10 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
1ac20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62  }.  if( (pBt->db
1ac30 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1ac40 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21  _ResetDatabase)!
1ac50 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
1ac60 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
1ac70 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
1ac80 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
1ac90 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
1aca0 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
1acb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
1acc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1acd0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
1ace0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
1acf0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
1ad00 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
1ad10 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
1ad20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
1ad30 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
1ad40 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
1ad50 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
1ad60 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
1ad70 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
1ad80 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
1ad90 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
1ada0 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
1adb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
1adc0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1add0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
1ade0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1adf0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
1ae00 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
1ae10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1ae20 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
1ae30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
1ae40 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
1ae50 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1ae60 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1ae70 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
1ae80 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
1ae90 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1aea0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
1aeb0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
1aec0 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
1aed0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1aee0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1aef0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1af00 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
1af10 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
1af20 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
1af30 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
1af40 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
1af50 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
1af60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1af70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
1af80 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
1af90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
1afa0 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
1afb0 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
1afc0 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
1afd0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
1afe0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
1aff0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
1b000 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
1b010 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
1b020 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
1b030 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
1b040 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
1b050 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
1b060 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
1b070 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
1b080 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
1b090 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
1b0a0 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
1b0b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1b0c0 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
1b0d0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
1b0e0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
1b0f0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1b100 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
1b110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b120 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
1b130 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
1b140 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b160 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1b170 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1b180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b190 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1b1a0 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
1b1b0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
1b1c0 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
1b1d0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
1b1e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1b1f0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1b200 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
1b210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b220 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
1b230 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1b240 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
1b250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b260 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
1b270 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
1b280 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
1b290 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  US+1);.    }.#en
1b2a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
1b2b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
1b2c0 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
1b2d0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
1b2e0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
1b2f0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
1b300 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
1b310 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
1b320 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
1b330 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
1b340 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1b350 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
1b360 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
1b370 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
1b380 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
1b390 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
1b3a0 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
1b3b0 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
1b3c0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
1b3d0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
1b3e0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
1b3f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
1b400 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1b410 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1b420 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1b430 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
1b440 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
1b450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1b460 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
1b470 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
1b480 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
1b490 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1b4a0 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
1b4b0 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
1b4c0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
1b4d0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
1b4e0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
1b4f0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
1b500 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
1b510 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b520 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
1b530 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
1b540 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
1b550 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
1b560 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
1b570 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
1b580 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
1b590 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
1b5a0 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
1b5b0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
1b5c0 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
1b5d0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
1b5e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
1b5f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1b600 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1b610 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
1b620 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
1b630 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b640 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
1b650 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
1b660 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
1b670 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
1b680 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
1b690 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
1b6a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1b6b0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
1b6c0 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
1b6d0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
1b6e0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
1b6f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
1b700 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
1b710 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
1b720 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
1b730 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
1b740 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1b750 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
1b760 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
1b770 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
1b780 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
1b790 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b7a0 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
1b7b0 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
1b7c0 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
1b7d0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
1b7e0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
1b7f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
1b800 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
1b810 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
1b820 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1b830 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
1b840 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
1b850 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
1b860 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
1b870 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
1b880 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
1b890 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
1b8a0 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
1b8b0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1b8c0 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
1b8d0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
1b8e0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1b8f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
1b900 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
1b910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1b920 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
1b930 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
1b940 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
1b950 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
1b960 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1b970 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
1b980 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1b990 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
1b9a0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1b9b0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
1b9c0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1b9d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b9e0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1b9f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
1ba00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
1ba40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
1ba50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ba60 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
1ba70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
1ba80 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26  riteSchema)==0 &
1ba90 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
1baa0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
1bab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bac0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1bad0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1bae0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1baf0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1bb00 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
1bb10 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
1bb20 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
1bb30 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
1bb40 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
1bb50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1bb60 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
1bb70 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
1bb80 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
1bb90 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
1bba0 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
1bbb0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
1bbc0 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
1bbd0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1bbe0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1bbf0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
1bc00 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1bc10 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc20 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
1bc30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bc40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1bc50 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
1bc60 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1bc70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
1bc80 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
1bc90 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
1bca0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1bcb0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
1bcc0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
1bcd0 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
1bce0 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
1bcf0 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
1bd00 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
1bd10 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
1bd20 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
1bd30 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
1bd40 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
1bd50 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
1bd60 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
1bd70 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
1bd80 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
1bd90 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
1bda0 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
1bdb0 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
1bdc0 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
1bdd0 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
1bde0 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
1bdf0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
1be00 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
1be10 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
1be20 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1be30 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
1be40 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
1be50 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
1be60 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
1be70 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
1be80 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
1be90 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
1bea0 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
1beb0 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
1bec0 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
1bed0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
1bee0 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
1bef0 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
1bf00 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
1bf10 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
1bf20 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
1bf30 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1bf40 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
1bf50 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
1bf60 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1bf70 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1bf80 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1bf90 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
1bfa0 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
1bfb0 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
1bfc0 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
1bfd0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1bfe0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1bff0 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
1c000 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
1c010 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1c020 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
1c030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
1c040 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1c050 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
1c060 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
1c070 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
1c080 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
1c090 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
1c0a0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1c0b0 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
1c0c0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1c0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c0e0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
1c0f0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
1c100 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1c110 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1c120 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1c130 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1c140 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
1c150 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
1c160 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
1c170 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1c180 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1c190 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1c1a0 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1c1b0 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1c1c0 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1c1d0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
1c1e0 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
1c1f0 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
1c200 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
1c210 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
1c220 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
1c230 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
1c240 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1c250 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1c260 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
1c270 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
1c280 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
1c290 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
1c2a0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1c2b0 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
1c2c0 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
1c2d0 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
1c2e0 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
1c2f0 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
1c300 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
1c310 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
1c320 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
1c330 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
1c340 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
1c350 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1c360 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1c370 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1c380 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1c390 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
1c3a0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
1c3b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
1c3c0 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
1c3d0 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
1c3e0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1c3f0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1c400 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1c410 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
1c420 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
1c430 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
1c440 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
1c450 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
1c460 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1c470 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
1c480 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1c490 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
1c4a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1c4b0 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
1c4c0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1c4d0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
1c4e0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
1c4f0 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
1c500 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1c510 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
1c520 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1c530 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
1c540 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1c550 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c560 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
1c570 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
1c580 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
1c590 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c5a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1c5b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1c5c0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
1c5d0 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
1c5e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c5f0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1c600 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
1c610 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1c620 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
1c630 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
1c640 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1c650 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
1c660 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
1c670 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
1c680 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1c690 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
1c6a0 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
1c6b0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
1c6c0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1c6d0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1c6e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1c6f0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1c700 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1c710 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1c720 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1c730 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1c740 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1c750 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1c760 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1c770 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1c780 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1c790 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1c7a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1c7b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1c7c0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1c7d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1c7e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c7f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c800 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1c810 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c830 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1c840 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1c850 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1c860 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1c870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c880 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1c890 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1c8a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1c8b0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1c8c0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1c8d0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1c8e0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1c8f0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1c900 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1c910 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1c920 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1c930 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1c940 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1c950 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1c960 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1c970 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1c980 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1c990 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1c9a0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1c9b0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1c9c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1c9d0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1c9e0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1c9f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1ca00 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1ca10 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1ca20 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1ca30 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1ca40 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1ca50 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1ca60 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1ca70 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1ca80 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1ca90 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1caa0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1cab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cac0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1cad0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1cae0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1caf0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1cb00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cb10 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1cb20 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1cb30 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1cb40 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1cb50 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1cb60 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1cb70 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1cb80 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1cb90 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1cba0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1cbb0 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1cbc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cbd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1cbe0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1cbf0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1cc00 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1cc10 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1cc20 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1cc30 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1cc40 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1cc50 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1cc60 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1cc70 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1cc80 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1cc90 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1cca0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ccb0 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1ccc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1ccd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1cce0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1ccf0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1cd00 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1cd10 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1cd20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1cd30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cd40 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1cd50 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1cd60 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1cd70 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1cd80 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1cd90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cda0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1cdb0 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1cdc0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1cdd0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1cde0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1cdf0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1ce00 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1ce10 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1ce20 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1ce30 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1ce40 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1ce50 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1ce60 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1ce70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1ce80 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1ce90 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1cea0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1ceb0 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1cec0 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1ced0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1cee0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1cef0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1cf00 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1cf10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1cf20 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1cf30 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1cf40 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1cf50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1cf60 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1cf70 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1cf80 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1cf90 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1cfa0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1cfb0 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1cfc0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1cfd0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1cfe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1cff0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1d000 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1d010 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1d020 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d030 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1d040 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d050 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1d060 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1d070 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1d080 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1d090 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1d0a0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1d0b0 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1d0c0 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1d0d0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1d0e0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1d0f0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1d100 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1d110 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1d120 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1d130 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1d140 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1d150 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1d160 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1d170 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1d180 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1d190 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1d1a0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1d1b0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1d1c0 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1d1d0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1d1e0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1d1f0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1d200 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1d210 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1d220 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1d230 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1d240 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1d250 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1d260 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1d270 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1d280 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1d290 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1d2a0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1d2b0 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1d2c0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1d2d0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1d2e0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1d2f0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1d300 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1d310 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1d320 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1d330 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1d340 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1d350 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1d360 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1d370 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1d380 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1d390 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1d3a0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1d3b0 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1d3c0 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1d3d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1d3e0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1d3f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1d400 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53 63 68  rflag, int *pSch
1d410 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42  emaVersion){.  B
1d420 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d430 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1d440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d450 6e 74 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d  nt bConcurrent =
1d460 20 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63 75 72   (p->db->bConcur
1d470 72 65 6e 74 20 26 26 20 21 49 53 41 55 54 4f 56  rent && !ISAUTOV
1d480 41 43 55 55 4d 29 3b 0a 0a 20 20 73 71 6c 69 74  ACUUM);..  sqlit
1d490 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1d4a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1d4b0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1d4c0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1d4d0 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1d4e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1d4f0 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1d500 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1d510 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1d520 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1d530 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1d540 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1d550 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1d560 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d570 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1d580 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1d590 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1d5a0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1d5b0 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1d5c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1d5d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1d5e0 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1d5f0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1d600 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ate)==0 );..  if
1d610 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  ( (p->db->flags 
1d620 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44 61  & SQLITE_ResetDa
1d630 74 61 62 61 73 65 29 20 0a 20 20 20 26 26 20 73  tabase) .   && s
1d640 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
1d650 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
1d660 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  r)==0 .  ){.    
1d670 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1d680 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b   ~BTS_READ_ONLY;
1d690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
1d6a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
1d6b0 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
1d6c0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
1d6d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
1d6e0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1d6f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1d700 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
1d710 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d720 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
1d730 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1d740 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1d750 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1d760 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71  CACHE.  {.    sq
1d770 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
1d780 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f  0;.    /* If ano
1d790 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
1d7a0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
1d7b0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
1d7c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
1d7d0 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
1d7e0 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
1d7f0 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
1d800 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1d810 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  n is.    ** requ
1d820 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
1d830 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20  LITE_LOCKED..   
1d840 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66   */.    if( (wrf
1d850 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
1d860 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1d870 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20  _WRITE).     || 
1d880 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1d890 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
1d8a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42  .    ){.      pB
1d8b0 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
1d8c0 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c  ter->db;.    }el
1d8d0 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
1d8e0 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20  ){.      BtLock 
1d8f0 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f  *pIter;.      fo
1d900 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1d910 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1d920 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1d930 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1d940 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
1d950 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b            pBlock
1d960 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
1d970 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1d980 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1d990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d9a0 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b     if( pBlock ){
1d9b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1d9c0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
1d9d0 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
1d9e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d9f0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
1da00 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ACHE;.      goto
1da10 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1da20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1da30 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
1da40 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
1da50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
1da60 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
1da70 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
1da80 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
1da90 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
1daa0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
1dab0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
1dac0 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
1dad0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1dae0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1daf0 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
1db00 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1db10 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
1db20 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
1db30 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1db40 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
1db50 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
1db60 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1db70 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1db80 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
1db90 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
1dba0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1dbb0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1dbc0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
1dbd0 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
1dbe0 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
1dbf0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
1dc00 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
1dc10 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
1dc20 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
1dc30 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1dc40 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
1dc50 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
1dc60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
1dc70 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1dc80 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
1dc90 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
1dca0 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
1dcb0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
1dcc0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1dcd0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1dce0 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
1dcf0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
1dd00 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
1dd10 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
1dd20 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
1dd30 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
1dd40 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
1dd50 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
1dd60 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1dd70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
1dd80 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1dd90 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
1dda0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
1ddb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1ddc0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
1ddd0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1dde0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1ddf0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1de00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1de10 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1de20 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1de30 65 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63 75 72  exFlag = bConcur
1de40 72 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77 72 66  rent ? -1 : (wrf
1de50 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  lag>1);.        
1de60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1de70 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
1de80 65 72 2c 20 65 78 46 6c 61 67 2c 20 73 71 6c 69  er, exFlag, sqli
1de90 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
1dea0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
1deb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ded0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1dee0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
1def0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1df00 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
1df10 54 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  T && pBt->inTran
1df20 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1df30 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1df40 20 2f 2a 20 69 66 20 74 68 65 72 65 20 77 61 73   /* if there was
1df50 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
1df60 6f 70 65 6e 65 64 20 77 68 65 6e 20 74 68 69 73  opened when this
1df70 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 0a 20 20   function was.  
1df80 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65          ** calle
1df90 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53  d and SQLITE_BUS
1dfa0 59 5f 53 4e 41 50 53 48 4f 54 20 69 73 20 72 65  Y_SNAPSHOT is re
1dfb0 74 75 72 6e 65 64 2c 20 63 68 61 6e 67 65 20 74  turned, change t
1dfc0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
1dfd0 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 53 51     ** code to SQ
1dfe0 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20  LITE_BUSY. */.  
1dff0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e000 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1e010 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e020 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
1e030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e040 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1e050 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1e060 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
1e070 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
1e080 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
1e090 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e0a0 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
1e0b0 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
1e0c0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
1e0d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1e0e0 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75  rResetLockTimeou
1e0f0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
1e100 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1e120 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1e130 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1e140 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1e150 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
1e160 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1e170 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
1e180 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1e190 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e1a0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
1e1b0 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
1e1c0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
1e1d0 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
1e1e0 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
1e1f0 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
1e200 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
1e210 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
1e220 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
1e230 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1e240 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
1e250 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
1e260 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
1e270 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
1e280 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
1e290 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1e2a0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1e2b0 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
1e2c0 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
1e2d0 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
1e2e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1e2f0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1e300 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1e310 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1e320 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
1e330 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
1e340 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
1e350 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
1e360 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1e370 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45  = ~BTS_EXCLUSIVE
1e380 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  ;.      if( wrfl
1e390 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46  ag>1 ) pBt->btsF
1e3a0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c  lags |= BTS_EXCL
1e3b0 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  USIVE;.#endif.. 
1e3c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
1e3d0 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69  b-size header fi
1e3e0 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74  eld is incorrect
1e3f0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
1e400 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a  f an old.      *
1e410 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65  * client has bee
1e420 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  n writing the da
1e430 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70  tabase file), up
1e440 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69  date it now. Doi
1e450 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
1e460 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
1e470 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20  han later means 
1e480 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1e490 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20  e can safely .  
1e4a0 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74      ** re-read t
1e4b0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e4c0 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20   from page 1 if 
1e4d0 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74  a savepoint or t
1e4e0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
1e4f0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63   ** rollback occ
1e500 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  urs within the t
1e510 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1e520 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1e530 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62  Bt->nPage!=get4b
1e540 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e550 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20  ta[28]) ){.     
1e560 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e570 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1e580 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e5a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e5b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1e5c0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1e5d0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1e5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e5f0 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73 5f     }.  }..trans_
1e600 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66 20 53  begun:.#ifndef S
1e610 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
1e620 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43 6f 6e  RRENT.  if( bCon
1e630 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d 3d 53  current && rc==S
1e640 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
1e650 74 65 33 50 61 67 65 72 49 73 57 61 6c 28 70 42  te3PagerIsWal(pB
1e660 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1e670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e680 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72 72 65  gerBeginConcurre
1e690 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
1e6a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e6b0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1e6c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
1e6d0 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61  treePtrmapAlloca
1e6e0 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  te(pBt);.    }. 
1e6f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
1e700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e710 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d  {.    if( pSchem
1e720 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20  aVersion ){.    
1e730 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f    *pSchemaVersio
1e740 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  n = get4byte(&pB
1e750 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e760 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [40]);.    }.   
1e770 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1e780 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
1e790 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
1e7a0 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
1e7b0 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
1e7c0 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 6f  er of.      ** o
1e7d0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1e7e0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1e7f0 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1e800 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1e810 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1e820 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1e830 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1e840 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1e850 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  ed here..      *
1e860 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 61 76  /.      int nSav
1e870 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 64 62 2d 3e  epoint = p->db->
1e880 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  nSavepoint;.    
1e890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e8a0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1e8b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 53  (pBt->pPager, nS
1e8c0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
1e8d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e8e0 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69 6e 74  OK && nSavepoint
1e8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e900 20 62 74 72 65 65 50 74 72 6d 61 70 42 65 67 69   btreePtrmapBegi
1e910 6e 28 70 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e  n(pBt, nSavepoin
1e920 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1e930 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  }.  }..  btreeIn
1e940 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1e950 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1e960 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1e970 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e980 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1e990 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1e9a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1e9b0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1e9c0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1e9d0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1e9e0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1e9f0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1ea00 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1ea10 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1ea20 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1ea30 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1ea40 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1ea50 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1ea60 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1ea70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1ea80 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1eab0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1eac0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1eaf0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1eb00 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1eb10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1eb40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1eb50 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1eb60 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1eb70 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1eb80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1eb90 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1eba0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1ebb0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1ebc0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1ebd0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1ebe0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1ebf0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1ec00 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  n rc;.  nCell = 
1ec10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1ec20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1ec30 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1ec40 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1ec50 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1ec60 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1ec70 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1ec80 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1ec90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1eca0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1ecb0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1ecc0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1ecd0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1ece0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1ecf0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1ed00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1ed10 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1ed20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1ed30 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1ed40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ed50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ed60 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1ed70 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1ed80 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1ed90 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1eda0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1edb0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1edc0 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1edd0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1ede0 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1edf0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1ee00 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1ee10 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1ee20 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1ee30 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1ee40 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1ee50 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1ee60 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1ee70 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1ee80 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1ee90 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1eea0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1eeb0 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1eec0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1eed0 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1eee0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1eef0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1ef00 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1ef10 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1ef20 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ef40 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1ef50 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1ef60 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1ef70 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1ef80 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1ef90 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1efa0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1efb0 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1efc0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1efd0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1efe0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1eff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1f000 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1f010 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1f020 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1f030 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1f040 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f050 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1f060 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1f070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1f080 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1f090 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1f0a0 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1f0b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1f0c0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1f0d0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1f0e0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1f0f0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1f100 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1f110 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1f120 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1f130 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1f140 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f150 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1f160 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
1f170 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
1f180 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
1f190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1f1a0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1f1b0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1f1c0 20 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69     rc = pPage->i
1f1d0 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f  sInit ? SQLITE_O
1f1e0 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67  K : btreeInitPag
1f1f0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1f200 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1f210 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1f220 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1f230 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1f240 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1f250 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1f260 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1f270 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1f280 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1f290 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1f2a0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1f2b0 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1f2c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1f2d0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1f2e0 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63     if( info.nLoc
1f2f0 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
1f300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1f310 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  ( pCell+info.nSi
1f320 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  ze > pPage->aDat
1f330 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  a+pPage->pBt->us
1f340 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
1f350 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1f360 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1f370 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
1f380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f390 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
1f3a0 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1f3b0 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20  nSize-4) ){.    
1f3c0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f3d0 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1f3e0 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  e-4, iTo);.     
1f3f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f410 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1f420 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
1f430 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
1f440 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
1f450 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
1f460 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1f470 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1f480 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f490 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
1f4a0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
1f4b0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
1f4c0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
1f4d0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
1f4e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1f4f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
1f500 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1f510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f520 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
1f530 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f540 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f550 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1f560 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
1f570 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
1f580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f590 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1f5a0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1f5b0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
1f5c0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
1f5d0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
1f5e0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
1f5f0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
1f600 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
1f610 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
1f620 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
1f630 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1f640 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
1f650 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
1f660 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
1f670 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
1f680 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1f690 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
1f6a0 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
1f6b0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1f6c0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1f6d0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1f6e0 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1f6f0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1f700 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1f710 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f720 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1f730 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1f740 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1f750 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1f760 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1f770 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1f780 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1f790 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1f7a0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1f7b0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1f7c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1f7d0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1f7e0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1f7f0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1f800 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1f810 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1f820 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1f830 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1f840 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1f850 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1f860 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1f870 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1f880 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1f890 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1f8a0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1f8b0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1f8c0 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1f8d0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1f8e0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1f8f0 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1f900 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1f910 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1f920 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1f930 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1f940 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1f950 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1f960 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1f970 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1f980 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1f990 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1f9a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f9b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1f9c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1f9d0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1f9e0 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1f9f0 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1fa00 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1fa10 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1fa20 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1fa30 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1fa40 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1fa50 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1fa60 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1fa70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1fa80 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1fa90 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1faa0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1fab0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1fac0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1fad0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1fae0 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1faf0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1fb00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1fb10 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1fb20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1fb30 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1fb40 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1fb50 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1fb60 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1fb70 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1fb80 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1fb90 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1fba0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1fbb0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1fbc0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1fbd0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1fbe0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1fbf0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1fc00 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1fc10 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1fc20 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1fc30 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1fc40 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1fc50 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1fc60 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1fc70 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1fc80 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1fc90 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1fca0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1fcb0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1fcc0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1fcd0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1fce0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1fcf0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1fd00 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1fd10 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1fd20 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1fd30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fd40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1fd50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1fd60 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1fd70 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1fd80 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1fd90 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1fda0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1fdb0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1fdc0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1fdd0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1fde0 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1fdf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fe00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fe10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1fe20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1fe30 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1fe40 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1fe50 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1fe60 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1fe70 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1fe80 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1fe90 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1fea0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1feb0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1fec0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1fed0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1fee0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1fef0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1ff00 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1ff10 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1ff20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1ff30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ff40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ff50 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1ff60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ff70 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1ff80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ff90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ffa0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ffb0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1ffc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ffd0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1ffe0 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1fff0 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
20000 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
20010 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
20020 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
20030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
20050 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
20060 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
20070 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
20080 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20090 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
200a0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
200b0 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
200c0 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
200d0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
200e0 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
200f0 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
20100 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
20110 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
20120 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
20130 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
20140 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
20150 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
20160 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
20170 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
20180 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
20190 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
201a0 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
201b0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
201c0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
201d0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
201e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
201f0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
20200 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
20210 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
20220 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
20230 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
20240 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
20250 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
20260 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
20270 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
20280 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
20290 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
202a0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
202b0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
202c0 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
202d0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
202e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
202f0 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
20300 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
20310 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
20320 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
20330 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
20340 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
20350 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
20360 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
20370 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
20380 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
20390 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
203a0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
203b0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
203c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
203d0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
203e0 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
203f0 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
20400 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
20410 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
20420 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
20430 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
20440 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
20450 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
20460 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
20470 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
20480 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
20490 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
204a0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
204b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
204c0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
204d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
204e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
204f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20500 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
20510 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
20520 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
20530 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
20540 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
20550 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
20560 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
20570 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
20580 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
20590 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
205a0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
205b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
205c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
205d0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
205e0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
205f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
20600 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
20610 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
20620 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
20630 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
20640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
20660 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20670 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
20680 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
20690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
206a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
206b0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
206c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
206d0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
206e0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
206f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
20700 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
20710 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
20720 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
20730 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
20740 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
20750 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
20760 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
20770 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
20780 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
20790 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
207a0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
207b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
207c0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
207d0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
207e0 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
207f0 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
20800 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
20810 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
20820 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
20830 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
20840 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
20850 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
20860 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
20870 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
20880 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
20890 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
208a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
208b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
208c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
208d0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
208e0 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
208f0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
20900 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
20910 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
20920 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
20930 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
20940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
20950 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
20960 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
20970 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
20980 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
20990 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
209a0 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
209b0 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
209c0 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
209d0 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
209e0 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
209f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
20a00 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
20a10 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
20a20 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
20a30 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
20a40 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
20a50 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
20a60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20a80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20a90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
20aa0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
20ab0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
20ac0 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
20ad0 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
20ae0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
20af0 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
20b00 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
20b10 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
20b20 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
20b30 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
20b40 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
20b50 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
20b60 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
20b70 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
20b80 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
20b90 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
20ba0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
20bb0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
20bc0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
20bd0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
20be0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20bf0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
20c00 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
20c10 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
20c20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
20c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
20c40 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
20c50 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
20c60 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
20c70 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
20c80 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
20c90 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
20ca0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
20cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20cc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
20cd0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
20ce0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
20cf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
20d00 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
20d10 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
20d20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
20d30 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
20d40 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
20d50 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
20d60 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
20d70 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
20d80 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
20d90 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
20da0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
20db0 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
20dc0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
20dd0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
20de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20df0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20e00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
20e10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
20e20 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
20e30 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
20e40 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
20e50 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
20e60 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
20e70 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
20e80 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
20e90 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
20ea0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
20eb0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
20ec0 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
20ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20ee0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
20ef0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
20f00 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
20f10 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
20f20 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
20f30 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
20f40 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
20f50 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
20f60 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
20f70 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
20f80 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
20f90 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
20fa0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
20fb0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
20fc0 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
20fd0 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
20fe0 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
20ff0 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
21000 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
21030 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
21040 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
21050 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
21060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21070 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
21080 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
21090 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
210a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
210b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
210c0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
210d0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
210e0 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
210f0 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
21100 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
21110 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
21120 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
21130 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
21140 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
21150 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
21160 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21170 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
21180 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
21190 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
211a0 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
211b0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
211c0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
211d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
211e0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
211f0 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
21200 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
21210 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
21220 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
21230 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
21240 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
21250 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
21260 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
21270 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
21280 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
21290 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
212a0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
212b0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
212c0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
212d0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
212e0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
212f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
21300 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
21310 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
21320 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
21330 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21340 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
21350 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
21360 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
21370 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
21380 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
21390 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
213a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
213b0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
213c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
213d0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
213e0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
213f0 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
21400 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21410 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
21420 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
21430 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
21440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
21450 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
21460 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
21470 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
21480 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
21490 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
214a0 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
214b0 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
214c0 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
214d0 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
214e0 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
214f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
21500 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
21510 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
21520 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
21530 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
21540 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
21550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
21570 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
21580 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
21590 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
215a0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
215b0 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
215c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
215d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
215e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
215f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21600 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
21610 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21620 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
21630 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
21640 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
21650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
21660 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
21670 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
21680 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
21690 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
216a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
216b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
216c0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
216d0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
216e0 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
216f0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
21700 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
21710 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
21720 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
21730 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21740 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
21750 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
21760 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
21770 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
21780 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
21790 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
217a0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
217b0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
217c0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
217d0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
217e0 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
217f0 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
21800 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
21810 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
21820 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
21830 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
21840 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
21850 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21860 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21870 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
21880 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
21890 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
218a0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
218b0 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
218c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
218d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
218e0 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
218f0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
21900 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
21910 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
21920 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
21930 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
21940 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
21950 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
21960 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
21970 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
21980 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
21990 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
219a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
219b0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
219c0 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
219d0 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
219e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
219f0 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
21a00 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
21a10 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
21a20 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
21a30 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
21a40 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
21a50 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
21a60 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
21a70 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
21a80 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
21a90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
21aa0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
21ab0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
21ac0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
21ad0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
21ae0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
21af0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
21b00 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
21b10 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
21b20 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
21b30 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
21b40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
21b50 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
21b60 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
21b70 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
21b80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21b90 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
21ba0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
21bb0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
21bc0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
21bd0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
21be0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
21bf0 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
21c00 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
21c10 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21c20 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
21c30 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
21c40 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
21c50 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
21c60 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
21c70 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
21c80 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
21c90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
21ca0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
21cb0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
21cc0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
21cd0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
21ce0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
21cf0 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
21d00 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
21d10 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
21d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21d30 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
21d40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21d50 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
21d60 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
21d70 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
21d80 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
21d90 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
21da0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
21db0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
21dc0 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
21dd0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
21de0 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
21df0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
21e00 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
21e10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21e20 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
21e30 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
21e40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
21e50 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
21e60 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
21e70 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
21e80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
21e90 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
21ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21eb0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
21ec0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
21ed0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
21ee0 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
21ef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21f00 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a  CONCURRENT./*.**
21f10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
21f20 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
21f30 20 6f 66 20 6d 65 72 67 69 6e 67 20 61 6e 20 43   of merging an C
21f40 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
21f50 63 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 74 68  ction with.** th
21f60 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68  e snapshot at th
21f70 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 77 61  e head of the wa
21f80 6c 20 66 69 6c 65 2e 20 49 74 20 72 65 6c 6f 63  l file. It reloc
21f90 61 74 65 73 20 61 6c 6c 20 70 61 67 65 73 20 69  ates all pages i
21fa0 6e 20 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 69  n the.** range i
21fb0 46 69 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e  First..iLast, in
21fc0 63 6c 75 73 69 76 65 2e 20 49 74 20 69 73 20 61  clusive. It is a
21fd0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
21fe0 42 74 72 65 65 50 74 72 6d 61 70 20 0a 2a 2a 20  BtreePtrmap .** 
21ff0 73 74 72 75 63 74 75 72 65 20 61 74 20 42 74 53  structure at BtS
22000 68 61 72 65 64 2e 70 4d 61 70 20 63 6f 6e 74 61  hared.pMap conta
22010 69 6e 73 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ins the location
22020 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 73   of the pointers
22030 20 74 6f 20 65 61 63 68 0a 2a 2a 20 70 61 67 65   to each.** page
22040 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a   in the range..*
22050 2a 0a 2a 2a 20 49 66 20 70 6e 43 75 72 72 65 6e  *.** If pnCurren
22060 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
22070 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
22080 20 72 61 6e 67 65 20 61 72 65 20 6d 6f 76 65 64   range are moved
22090 20 74 6f 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   to currently.**
220a0 20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20   free locations 
220b0 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20  (i.e. free-list 
220c0 65 6e 74 72 69 65 73 29 20 77 69 74 68 69 6e 20  entries) within 
220d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
220e0 65 20 62 65 66 6f 72 65 20 70 61 67 65 0a 2a 2a  e before page.**
220f0 20 69 46 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 4f   iFirst..**.** O
22100 72 2c 20 69 66 20 70 6e 43 75 72 72 65 6e 74 20  r, if pnCurrent 
22110 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
22120 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  n it points to a
22130 20 76 61 6c 75 65 20 63 6f 6e 74 61 69 6e 69 6e   value containin
22140 67 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  g the.** current
22150 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
22160 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
22170 67 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ges. In this cas
22180 65 2c 20 61 6c 6c 20 70 61 67 65 73 20 61 72 65  e, all pages are
22190 0a 2a 2a 20 72 65 6c 6f 63 61 74 65 64 20 74 6f  .** relocated to
221a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
221b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2d 20  database file - 
221c0 70 61 67 65 20 69 46 69 72 73 74 20 69 73 20 72  page iFirst is r
221d0 65 6c 6f 63 61 74 65 64 20 74 6f 0a 2a 2a 20 70  elocated to.** p
221e0 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b  age (*pnCurrent+
221f0 31 29 2c 20 70 61 67 65 20 69 46 69 72 73 74 2b  1), page iFirst+
22200 31 20 74 6f 20 70 61 67 65 20 28 2a 70 6e 43 75  1 to page (*pnCu
22210 72 72 65 6e 74 2b 32 29 2c 20 61 6e 64 20 73 6f  rrent+2), and so
22220 20 6f 6e 2e 0a 2a 2a 20 56 61 6c 75 65 20 2a 70   on..** Value *p
22230 6e 43 75 72 72 65 6e 74 20 69 73 20 73 65 74 20  nCurrent is set 
22240 74 6f 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  to the new size 
22250 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22260 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  before this .** 
22270 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
22280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
22290 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
222a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
222b0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
222c0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
222d0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
222e0 74 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52  t btreeRelocateR
222f0 61 6e 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  ange(.  BtShared
22300 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
22310 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 74 72 65          /* B-tre
22320 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67  e handle */.  Pg
22330 6e 6f 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  no iFirst,      
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22350 20 46 69 72 73 74 20 70 61 67 65 20 74 6f 20 72   First page to r
22360 65 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67 6e  elocate */.  Pgn
22370 6f 20 69 4c 61 73 74 2c 20 20 20 20 20 20 20 20  o iLast,        
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22390 4c 61 73 74 20 70 61 67 65 20 74 6f 20 72 65 6c  Last page to rel
223a0 6f 63 61 74 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  ocate */.  Pgno 
223b0 2a 70 6e 43 75 72 72 65 6e 74 20 20 20 20 20 20  *pnCurrent      
223c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
223d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 49 4e 2f 4f 55   not NULL, IN/OU
223e0 54 3a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  T: Database size
223f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
22400 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
22410 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
22420 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
22430 50 67 6e 6f 20 69 50 67 3b 0a 0a 20 20 66 6f 72  Pgno iPg;..  for
22440 28 69 50 67 3d 69 46 69 72 73 74 3b 20 69 50 67  (iPg=iFirst; iPg
22450 3c 3d 69 4c 61 73 74 20 26 26 20 72 63 3d 3d 53  <=iLast && rc==S
22460 51 4c 49 54 45 5f 4f 4b 3b 20 69 50 67 2b 2b 29  QLITE_OK; iPg++)
22470 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
22480 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Free = 0;     /*
22490 20 50 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   Page allocated 
224a0 66 72 6f 6d 20 66 72 65 65 2d 6c 69 73 74 20 2a  from free-list *
224b0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
224c0 50 67 20 3d 20 30 3b 0a 20 20 20 20 50 67 6e 6f  Pg = 0;.    Pgno
224d0 20 69 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   iNew;          
224e0 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 67 65 20      /* New page 
224f0 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 2a  number for pPg *
22500 2f 0a 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72  /.    PtrmapEntr
22510 79 20 2a 70 45 6e 74 72 79 3b 20 20 20 20 2f 2a  y *pEntry;    /*
22520 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   Pointer map ent
22530 72 79 20 66 6f 72 20 70 61 67 65 20 69 50 67 20  ry for page iPg 
22540 2a 2f 0a 0a 20 20 20 20 69 66 28 20 69 50 67 3d  */..    if( iPg=
22550 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
22560 47 45 28 70 42 74 29 20 29 20 63 6f 6e 74 69 6e  GE(pBt) ) contin
22570 75 65 3b 0a 20 20 20 20 70 45 6e 74 72 79 20 3d  ue;.    pEntry =
22580 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b 69 50 67   &pMap->aPtr[iPg
22590 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 5d   - pMap->iFirst]
225a0 3b 0a 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72  ;..    if( pEntr
225b0 79 2d 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  y->eType==PTRMAP
225c0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
225d0 20 20 20 50 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20     Pgno dummy;. 
225e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
225f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
22600 20 26 70 46 72 65 65 2c 20 26 64 75 6d 6d 79 2c   &pFree, &dummy,
22610 20 69 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58   iPg, BTALLOC_EX
22620 41 43 54 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  ACT);.      rele
22630 61 73 65 50 61 67 65 28 70 46 72 65 65 29 3b 0a  asePage(pFree);.
22640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
22650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64  !=SQLITE_OK || d
22660 75 6d 6d 79 3d 3d 69 50 67 20 29 3b 0a 20 20 20  ummy==iPg );.   
22670 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 75 72   }else if( pnCur
22680 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 62 74  rent ){.      bt
22690 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
226a0 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  iPg, &pPg, 0);. 
226b0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
226c0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
226d0 61 62 6c 65 28 70 50 67 2d 3e 70 44 62 50 61 67  able(pPg->pDbPag
226e0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
226f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
22700 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
22710 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31 20 29 3b  ->pDbPage)==1 );
22720 0a 20 20 20 20 20 20 69 4e 65 77 20 3d 20 2b 2b  .      iNew = ++
22730 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20  (*pnCurrent);.  
22740 20 20 20 20 69 66 28 20 69 4e 65 77 3d 3d 50 45      if( iNew==PE
22750 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
22760 70 42 74 29 20 29 20 69 4e 65 77 20 3d 20 2b 2b  pBt) ) iNew = ++
22770 28 2a 70 6e 43 75 72 72 65 6e 74 29 3b 0a 20 20  (*pnCurrent);.  
22780 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
22790 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c 20  ePage(pBt, pPg, 
227a0 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20 70  pEntry->eType, p
227b0 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 20 69  Entry->parent, i
227c0 4e 65 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  New, 1);.      r
227d0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
227e0 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  l(pPg);.    }els
227f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  e{.      rc = al
22800 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
22810 70 42 74 2c 20 26 70 46 72 65 65 2c 20 26 69 4e  pBt, &pFree, &iN
22820 65 77 2c 20 69 46 69 72 73 74 2d 31 2c 20 42 54  ew, iFirst-1, BT
22830 41 4c 4c 4f 43 5f 4c 45 29 3b 0a 20 20 20 20 20  ALLOC_LE);.     
22840 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22850 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 77 3c 69  ITE_OK || iNew<i
22860 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 69  First );.      i
22870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22880 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
22890 61 73 65 50 61 67 65 28 70 46 72 65 65 29 3b 0a  asePage(pFree);.
228a0 20 20 20 20 20 20 20 20 62 74 72 65 65 47 65 74          btreeGet
228b0 50 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26  Page(pBt, iPg, &
228c0 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  pPg, 0);.       
228d0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
228e0 67 65 28 70 42 74 2c 20 70 50 67 2c 20 70 45 6e  ge(pBt, pPg, pEn
228f0 74 72 79 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74  try->eType, pEnt
22900 72 79 2d 3e 70 61 72 65 6e 74 2c 69 4e 65 77 2c  ry->parent,iNew,
22910 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  1);.        rele
22920 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
22930 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22950 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
22960 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
22970 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 2d  NT).**.** The b-
22980 74 72 65 65 20 68 61 6e 64 6c 65 20 70 61 73 73  tree handle pass
22990 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
229a0 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
229b0 20 74 6f 20 63 6f 6d 6d 69 74 20 61 6e 0a 2a 2a   to commit an.**
229c0 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e   CONCURRENT tran
229d0 73 61 63 74 69 6f 6e 2e 20 41 74 20 74 68 69 73  saction. At this
229e0 20 70 6f 69 6e 74 20 69 74 20 69 73 20 67 75 61   point it is gua
229f0 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 69  ranteed that thi
22a00 73 20 69 73 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  s is .** possibl
22a10 65 20 2d 20 74 68 65 20 77 61 6c 20 57 52 49 54  e - the wal WRIT
22a20 45 52 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ER lock is held 
22a30 61 6e 64 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20  and it is known 
22a40 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 0a  that there are .
22a50 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 73 20  ** no conflicts 
22a60 77 69 74 68 20 63 6f 6d 6d 69 74 74 65 64 20 74  with committed t
22a70 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ransactions..*/.
22a80 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
22a90 46 69 78 55 6e 6c 6f 63 6b 65 64 28 42 74 72 65  FixUnlocked(Btre
22aa0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
22ab0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
22ac0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
22ad0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
22ae0 3b 0a 20 20 75 38 20 2a 70 31 20 3d 20 70 50 61  ;.  u8 *p1 = pPa
22af0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 50 61  ge1->aData;.  Pa
22b00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
22b10 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
22b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22b30 0a 0a 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31  ..  /* If page 1
22b40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22b50 20 69 73 20 6e 6f 74 20 77 72 69 74 61 62 6c 65   is not writable
22b60 2c 20 74 68 65 6e 20 6e 6f 20 70 61 67 65 73 20  , then no pages 
22b70 77 65 72 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  were allocated. 
22b80 20 2a 2a 20 6f 72 20 66 72 65 65 64 20 62 79 20   ** or freed by 
22b90 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
22ba0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e  . In this case n
22bb0 6f 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  o special handli
22bc0 6e 67 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  ng is .  ** requ
22bd0 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ired. Otherwise,
22be0 20 69 66 20 70 61 67 65 20 31 20 69 73 20 64 69   if page 1 is di
22bf0 72 74 79 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  rty, proceed.  *
22c00 2f 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70 20  /.  BtreePtrmap 
22c10 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61  *pMap = pBt->pMa
22c20 70 3b 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  p;.  Pgno iTrunk
22c30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
22c40 33 32 5d 29 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  32]);.  Pgno nPa
22c50 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
22c60 75 6e 74 28 70 42 74 29 3b 0a 20 20 75 33 32 20  unt(pBt);.  u32 
22c70 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
22c80 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 61 73  (&p1[36]);..  as
22c90 73 65 72 74 28 20 70 42 74 2d 3e 70 4d 61 70 20  sert( pBt->pMap 
22ca0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22cb0 33 50 61 67 65 72 55 70 67 72 61 64 65 53 6e 61  3PagerUpgradeSna
22cc0 70 73 68 6f 74 28 70 50 61 67 65 72 2c 20 70 50  pshot(pPager, pP
22cd0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
22ce0 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 50    assert( p1==pP
22cf0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a  age1->aData );..
22d00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  _OK ){.    Pgno 
22d20 6e 48 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  nHPage = get4byt
22d30 65 28 26 70 31 5b 32 38 5d 29 3b 0a 20 20 20 20  e(&p1[28]);.    
22d40 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 6e 48 50 61  Pgno nFin = nHPa
22d50 67 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ge;         /* S
22d60 69 7a 65 20 6f 66 20 64 62 20 61 66 74 65 72 20  ize of db after 
22d70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 72 67  transaction merg
22d80 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 73 71  e */..    if( sq
22d90 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
22da0 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
22db0 62 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  bPage) ){.      
22dc0 50 67 6e 6f 20 69 48 54 72 75 6e 6b 20 3d 20 67  Pgno iHTrunk = g
22dd0 65 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 29  et4byte(&p1[32])
22de0 3b 0a 20 20 20 20 20 20 75 33 32 20 6e 48 46 72  ;.      u32 nHFr
22df0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
22e00 31 5b 33 36 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  1[36]);..      /
22e10 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 65 61  * Attach the hea
22e20 64 20 64 61 74 61 62 61 73 65 20 66 72 65 65 20  d database free 
22e30 6c 69 73 74 20 74 6f 20 74 68 65 20 65 6e 64 20  list to the end 
22e40 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  of the current. 
22e50 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
22e60 69 6f 6e 73 20 66 72 65 65 2d 6c 69 73 74 20 28  ions free-list (
22e70 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a 20 20 20  if any).  */.   
22e80 20 20 20 69 66 28 20 69 54 72 75 6e 6b 21 3d 30     if( iTrunk!=0
22e90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
22ea0 62 79 74 65 28 26 70 31 5b 33 36 5d 2c 20 6e 48  byte(&p1[36], nH
22eb0 46 72 65 65 20 2b 20 6e 46 72 65 65 29 3b 0a 20  Free + nFree);. 
22ec0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
22ed0 26 70 31 5b 33 32 5d 2c 20 69 54 72 75 6e 6b 29  &p1[32], iTrunk)
22ee0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
22ef0 20 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20   iTrunk ){.     
22f00 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 54 72       DbPage *pTr
22f10 75 6e 6b 20 3d 20 73 71 6c 69 74 65 33 50 61 67  unk = sqlite3Pag
22f20 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
22f30 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20   iTrunk);.      
22f40 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
22f50 34 62 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e  4byte((u8*)pTrun
22f60 6b 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  k->pData);.     
22f70 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3d       if( iTrunk=
22f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22f90 20 20 70 75 74 34 62 79 74 65 28 28 75 38 2a 29    put4byte((u8*)
22fa0 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 2c 20 69  pTrunk->pData, i
22fb0 48 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  HTrunk);.       
22fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
22fd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
22fe0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (pTrunk);.      
22ff0 20 20 7d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    };.      }..  
23000 20 20 20 20 69 66 28 20 6e 48 50 61 67 65 3c 28      if( nHPage<(
23010 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20  pMap->iFirst-1) 
23020 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
23030 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 69  e database consi
23040 73 74 65 64 20 6f 66 20 28 70 4d 61 70 2d 3e 69  sted of (pMap->i
23050 46 69 72 73 74 2d 31 29 20 70 61 67 65 73 20 77  First-1) pages w
23060 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
23070 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 75          ** concu
23080 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23090 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 41 6e  n was opened. An
230a0 64 20 61 6e 20 63 6f 6e 63 75 72 72 65 6e 74 20  d an concurrent 
230b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 0a  transaction may.
230c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62          ** not b
230d0 65 20 65 78 65 63 75 74 65 64 20 6f 6e 20 61 6e  e executed on an
230e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
230f0 61 62 61 73 65 20 2d 20 73 6f 20 74 68 65 20 64  abase - so the d
23100 62 20 73 68 6f 75 6c 64 20 0a 20 20 20 20 20 20  b should .      
23110 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20 73 68    ** not have sh
23120 72 75 6e 6b 20 73 69 6e 63 65 20 74 68 65 20 74  runk since the t
23130 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
23140 70 65 6e 65 64 2e 20 54 68 65 72 65 66 6f 72 65  pened. Therefore
23150 20 6e 48 50 61 67 65 0a 20 20 20 20 20 20 20 20   nHPage.        
23160 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  ** should be set
23170 20 74 6f 20 28 70 4d 61 70 2d 3e 69 46 69 72 73   to (pMap->iFirs
23180 74 2d 31 29 20 6f 72 20 67 72 65 61 74 65 72 2e  t-1) or greater.
23190 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
231a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
231b0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
231c0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
231d0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
231e0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 64 20  ction allocated 
231f0 70 61 67 65 73 20 70 4d 61 70 2d 3e 69 46 69 72  pages pMap->iFir
23200 73 74 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20  st through.     
23210 20 20 20 2a 2a 20 6e 50 61 67 65 20 28 69 6e 63     ** nPage (inc
23220 6c 75 73 69 76 65 29 20 61 74 20 74 68 65 20 65  lusive) at the e
23230 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
23240 73 65 20 66 69 6c 65 2e 20 4d 65 61 6e 77 68 69  se file. Meanwhi
23250 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  le,.        ** o
23260 74 68 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  ther transaction
23270 73 20 68 61 76 65 20 61 6c 6c 6f 63 61 74 65 64  s have allocated
23280 20 28 69 46 69 72 73 74 2e 2e 6e 48 50 61 67 65   (iFirst..nHPage
23290 29 2e 20 53 6f 20 6d 6f 76 65 0a 20 20 20 20 20  ). So move.     
232a0 20 20 20 2a 2a 20 70 61 67 65 73 20 28 69 46 69     ** pages (iFi
232b0 72 73 74 2e 2e 4d 49 4e 28 6e 50 61 67 65 2c 6e  rst..MIN(nPage,n
232c0 48 50 61 67 65 29 29 20 74 6f 20 28 4d 41 58 28  HPage)) to (MAX(
232d0 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 2b 31 29  nPage,nHPage)+1)
232e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67  .  */.        Pg
232f0 6e 6f 20 69 4c 61 73 74 20 3d 20 4d 49 4e 28 6e  no iLast = MIN(n
23300 50 61 67 65 2c 20 6e 48 50 61 67 65 29 3b 20 20  Page, nHPage);  
23310 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 74    /* Last page t
23320 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20  o move */.      
23330 20 20 50 67 6e 6f 20 6e 43 75 72 72 65 6e 74 3b    Pgno nCurrent;
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
23360 20 73 69 7a 65 20 6f 66 20 64 62 20 2a 2f 0a 20   size of db */. 
23370 20 20 20 20 20 20 20 6e 43 75 72 72 65 6e 74 20         nCurrent 
23380 3d 20 4d 41 58 28 6e 50 61 67 65 2c 20 6e 48 50  = MAX(nPage, nHP
23390 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
233a0 20 3d 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65   = btreeRelocate
233b0 52 61 6e 67 65 28 70 42 74 2c 20 70 4d 61 70 2d  Range(pBt, pMap-
233c0 3e 69 46 69 72 73 74 2c 20 69 4c 61 73 74 2c 20  >iFirst, iLast, 
233d0 26 6e 43 75 72 72 65 6e 74 29 3b 0a 0a 20 20 20  &nCurrent);..   
233e0 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72       /* There ar
233f0 65 20 6e 6f 77 20 6e 6f 20 63 6f 6c 6c 69 73 69  e now no collisi
23400 6f 6e 73 20 77 69 74 68 20 74 68 65 20 73 6e 61  ons with the sna
23410 70 73 68 6f 74 20 61 74 20 74 68 65 20 68 65 61  pshot at the hea
23420 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  d of the.       
23430 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
23440 65 2e 20 53 6f 20 61 74 20 74 68 69 73 20 70 6f  e. So at this po
23450 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20  int it would be 
23460 70 6f 73 73 69 62 6c 65 20 74 6f 20 77 72 69 74  possible to writ
23470 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
23480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 75 74   transaction out
23490 20 74 6f 20 64 69 73 6b 2e 20 42 65 66 6f 72 65   to disk. Before
234a0 20 64 6f 69 6e 67 20 73 6f 20 74 68 6f 75 67 68   doing so though
234b0 2c 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 20  , attempt to.   
234c0 20 20 20 20 20 2a 2a 20 72 65 6c 6f 63 61 74 65       ** relocate
234d0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   some of the new
234e0 20 70 61 67 65 73 20 74 6f 20 66 72 65 65 20 6c   pages to free l
234f0 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 69 6e 20  ocations within 
23500 74 68 65 20 62 6f 64 79 0a 20 20 20 20 20 20 20  the body.       
23510 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
23520 61 73 65 20 66 69 6c 65 20 28 69 2e 65 2e 20 66  ase file (i.e. f
23530 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73  ree-list entries
23540 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ). */.        if
23550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
23570 65 72 74 28 20 6e 43 75 72 72 65 6e 74 21 3d 50  ert( nCurrent!=P
23580 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
23590 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 20  (pBt) );.       
235a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
235b0 65 74 44 62 73 69 7a 65 28 70 42 74 2d 3e 70 50  etDbsize(pBt->pP
235c0 61 67 65 72 2c 20 6e 43 75 72 72 65 6e 74 29 3b  ager, nCurrent);
235d0 0a 20 20 20 20 20 20 20 20 20 20 6e 46 72 65 65  .          nFree
235e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
235f0 33 36 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  36]);.          
23600 6e 46 69 6e 20 3d 20 6e 43 75 72 72 65 6e 74 2d  nFin = nCurrent-
23610 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 20 20 20  nFree;.         
23620 20 69 66 28 20 6e 43 75 72 72 65 6e 74 3e 50 45   if( nCurrent>PE
23630 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
23640 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45  pBt) && nFin<=PE
23650 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
23660 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
23670 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
23680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23690 20 20 6e 46 69 6e 20 3d 20 4d 41 58 28 6e 46 69    nFin = MAX(nFi
236a0 6e 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20 20 20  n, nHPage);.    
236b0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
236c0 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42  RelocateRange(pB
236d0 74 2c 20 6e 46 69 6e 2b 31 2c 20 6e 43 75 72 72  t, nFin+1, nCurr
236e0 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ent, 0);.       
236f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 75 74 34   }..        put4
23700 62 79 74 65 28 26 70 31 5b 32 38 5d 2c 20 6e 46  byte(&p1[28], nF
23710 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  in);.      }.   
23720 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
23730 67 65 72 53 65 74 44 62 73 69 7a 65 28 70 50 61  gerSetDbsize(pPa
23740 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 7d 0a  ger, nFin);.  }.
23750 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23760 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 62  #else.# define b
23770 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28  treeFixUnlocked(
23780 58 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  X)  SQLITE_OK.#e
23790 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
237a0 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a  MIT_CONCURRENT *
237b0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
237c0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
237d0 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
237e0 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
237f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
23800 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
23810 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
23820 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
23830 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
23840 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
23850 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
23860 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
23870 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
23880 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
23890 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
238a0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
238b0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
238c0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
238d0 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
238e0 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
238f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
23900 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
23910 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
23920 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
23930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
23940 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
23950 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
23960 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
23970 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
23980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23990 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
239a0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
239b0 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
239c0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
239d0 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
239e0 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
239f0 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
23a00 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
23a10 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
23a20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
23a30 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
23a40 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
23a50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
23a60 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
23a70 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
23a80 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
23a90 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
23aa0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
23ab0 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
23ac0 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
23ad0 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
23ae0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
23af0 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
23b00 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
23b10 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
23b20 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
23b30 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
23b40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
23b50 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
23b60 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
23b70 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
23b80 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
23b90 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
23ba0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
23bb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
23bc0 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
23bd0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
23be0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
23bf0 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
23c00 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
23c10 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
23c20 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
23c30 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
23c40 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
23c50 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
23c60 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
23c70 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
23c80 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
23c90 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
23ca0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
23cb0 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
23cc0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23cd0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
23ce0 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
23cf0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
23d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23d10 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
23d20 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
23d30 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
23d40 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
23d50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
23d60 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23d70 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
23d80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23d90 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
23da0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
23db0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23dc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
23dd0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
23de0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23df0 20 20 61 73 73 65 72 74 28 20 49 53 43 4f 4e 43    assert( ISCONC
23e00 55 52 52 45 4e 54 3d 3d 30 20 29 3b 0a 20 20 20  URRENT==0 );.   
23e10 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
23e20 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
23e30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23e50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
23e60 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
23e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
23e80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
23e90 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
23ea0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
23eb0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
23ec0 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
23ed0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
23ee0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
23ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23f00 4b 20 26 26 20 49 53 43 4f 4e 43 55 52 52 45 4e  K && ISCONCURREN
23f10 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  T ){.      rc = 
23f20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64  btreeFixUnlocked
23f30 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (p);.    }.    i
23f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23f50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23f60 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
23f70 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
23f80 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
23f90 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
23fa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23fb0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
23fc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23fd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23fe0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
23ff0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
24000 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
24010 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
24020 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
24030 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
24040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
24050 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
24060 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
24070 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
24080 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
24090 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
240a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
240b0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
240c0 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
240d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
240e0 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
240f0 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
24100 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
24110 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
24120 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
24130 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
24140 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
24150 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
24160 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
24170 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
24180 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
24190 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
241a0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
241b0 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
241c0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
241d0 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
241e0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
241f0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
24200 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
24210 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
24220 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
24230 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
24240 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
24250 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
24260 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
24270 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
24280 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
24290 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
242a0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
242b0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
242c0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
242d0 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
242e0 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
242f0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
24300 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
24310 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
24320 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
24330 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
24340 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
24350 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
24360 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
24370 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
24380 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
24390 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
243a0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
243b0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
243c0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
243d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
243e0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
243f0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
24400 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
24410 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
24420 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
24430 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
24440 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
24450 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
24460 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
24470 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
24480 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
24490 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
244a0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
244b0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
244c0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
244d0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
244e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
244f0 74 68 69 73 20 77 61 73 20 61 6e 20 43 4f 4e 43  this was an CONC
24500 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69  URRENT transacti
24510 6f 6e 2c 20 64 65 6c 65 74 65 20 74 68 65 20 70  on, delete the p
24520 42 74 2d 3e 70 4d 61 70 20 6f 62 6a 65 63 74 2e  Bt->pMap object.
24530 0a 20 20 2a 2a 20 41 6c 73 6f 20 63 61 6c 6c 20  .  ** Also call 
24540 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65  PagerEndConcurre
24550 6e 74 28 29 20 74 6f 20 65 6e 73 75 72 65 20 74  nt() to ensure t
24560 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
24570 73 20 64 69 73 63 61 72 64 65 64 0a 20 20 2a 2a  s discarded.  **
24580 20 74 68 65 20 72 65 63 6f 72 64 20 6f 66 20 61   the record of a
24590 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 77 69  ll pages read wi
245a0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
245b0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 62 74 72 65  tion.  */.  btre
245c0 65 50 74 72 6d 61 70 44 65 6c 65 74 65 28 70 42  ePtrmapDelete(pB
245d0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t);.  sqlite3Pag
245e0 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28  erEndConcurrent(
245f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
24600 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
24610 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
24620 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
24630 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
24640 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
24650 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
24660 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
24670 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
24680 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
24690 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
246a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
246b0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
246c0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
246d0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
246e0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
246f0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
24700 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
24710 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
24720 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
24730 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
24740 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
24750 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
24760 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
24770 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
24780 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
24790 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
247a0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
247b0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
247c0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
247d0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
247e0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
247f0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
24800 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
24810 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
24820 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
24830 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
24840 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
24850 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
24860 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
24870 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
24880 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
24890 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
248a0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
248b0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
248c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
248d0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
248e0 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
248f0 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
24900 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
24910 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
24920 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
24930 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
24940 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
24950 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
24960 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
24970 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
24980 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
24990 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
249a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
249b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
249c0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
249d0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
249e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
249f0 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
24a00 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
24a10 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
24a20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
24a30 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
24a40 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
24a50 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
24a60 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
24a70 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
24a80 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
24a90 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
24aa0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
24ab0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
24ac0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
24ad0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
24ae0 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
24af0 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
24b00 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
24b10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
24b20 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
24b30 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
24b40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
24b50 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
24b60 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
24b70 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
24b80 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
24b90 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
24ba0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
24bb0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
24bc0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
24bd0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
24be0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
24bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24c00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24c10 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
24c20 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
24c30 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
24c40 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
24c50 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
24c60 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
24c70 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
24c80 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
24c90 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
24ca0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
24cb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
24cc0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
24cd0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
24ce0 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
24cf0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
24d00 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
24d10 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
24d20 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
24d30 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
24d40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
24d50 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24d60 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
24d70 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
24d80 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
24d90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
24da0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
24db0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
24dc0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
24dd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24de0 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
24df0 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
24e00 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
24e10 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
24e20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
24e30 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
24e40 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
24e50 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
24e60 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
24e70 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
24e80 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
24e90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24eb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
24ec0 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
24ed0 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
24ee0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
24ef0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
24f00 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
24f10 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
24f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
24f30 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
24f40 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
24f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24f60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
24f70 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
24f80 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
24f90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24fa0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
24fb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
24fc0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
24fd0 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
24fe0 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
24ff0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
25000 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
25010 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
25020 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
25030 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
25040 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
25050 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
25060 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
25070 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
25080 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
25090 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
250a0 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
250b0 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
250c0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
250d0 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
250e0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
250f0 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
25100 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
25110 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
25120 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
25130 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
25140 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
25150 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25160 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
25170 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
25180 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
25190 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
251a0 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
251b0 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
251c0 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
251d0 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
251e0 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
251f0 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
25200 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
25210 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
25220 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
25230 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
25240 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
25250 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
25260 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
25270 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
25280 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
25290 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
252a0 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
252b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
252c0 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
252d0 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
252e0 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
252f0 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
25300 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
25310 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
25320 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
25330 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
25340 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
25350 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
25360 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
25370 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
25380 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
25390 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
253a0 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
253b0 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
253c0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
253d0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
253e0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
253f0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
25400 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
25410 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
25420 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25430 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
25440 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
25450 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
25460 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
25470 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
25480 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25490 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
254a0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
254b0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
254c0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
254d0 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
254e0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
254f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25500 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25510 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
25520 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
25530 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
25540 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
25550 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
25560 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25570 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
25580 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
25590 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
255a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
255b0 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
255c0 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
255d0 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
255e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
255f0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
25600 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
25610 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
25620 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
25630 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
25640 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
25650 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
25660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25670 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
25680 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
25690 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
256a0 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
256b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
256c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
256d0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
256e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
256f0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
25700 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
25710 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
25720 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
25730 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
25740 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
25750 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
25760 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
25770 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25780 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
25790 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
257a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
257b0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
257c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
257d0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
257e0 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
257f0 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
25800 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
25810 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
25820 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
25830 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
25840 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
25850 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
25860 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
25870 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
25880 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
25890 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
258a0 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
258b0 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
258c0 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
258d0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
258e0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
258f0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
25900 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25910 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
25920 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
25930 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
25940 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
25950 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
25960 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
25970 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
25980 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
25990 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
259a0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
259b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
259c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
259d0 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
259e0 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
259f0 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
25a00 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
25a10 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
25a20 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
25a30 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
25a40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
25a50 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
25a60 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
25a70 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
25a80 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
25a90 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
25aa0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
25ab0 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
25ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
25ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
25ae0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
25af0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
25b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
25b10 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
25b20 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
25b30 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
25b40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
25b50 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
25b60 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
25b70 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
25b80 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
25b90 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
25ba0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
25bb0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
25bc0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
25bd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
25be0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
25bf0 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
25c00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
25c10 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
25c20 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
25c30 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
25c40 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
25c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
25c60 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
25c70 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
25c80 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
25c90 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
25ca0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
25cb0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
25cc0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
25cd0 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
25ce0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
25cf0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
25d00 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
25d10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
25d20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
25d30 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
25d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25d50 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
25d60 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
25d70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
25d80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
25d90 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
25da0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
25db0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
25dc0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
25dd0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
25de0 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
25df0 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
25e00 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
25e10 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
25e20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
25e30 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
25e40 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
25e50 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
25e60 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
25e70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
25e80 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
25e90 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
25ea0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
25eb0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
25ec0 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
25ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
25ee0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
25ef0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
25f00 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
25f10 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
25f20 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
25f30 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
25f40 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
25f50 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
25f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
25f70 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
25f80 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
25f90 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
25fa0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
25fb0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
25fc0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
25fd0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
25fe0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
25ff0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
26000 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
26010 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
26020 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
26030 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
26040 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
26050 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
26060 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
26070 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
26080 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
26090 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
260a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
260b0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
260c0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
260d0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
260e0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
260f0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
26100 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
26110 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
26120 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26130 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
26140 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
26150 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
26160 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
26170 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
26180 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
26190 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
261a0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
261b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
261c0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
261d0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
261e0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
261f0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
26200 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
26210 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
26220 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
26230 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
26240 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
26250 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
26260 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
26270 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
26280 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
26290 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
262a0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
262b0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
262c0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
262d0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
262e0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
262f0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
26300 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
26310 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
26320 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
26330 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
26340 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
26350 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
26360 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
26370 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
26380 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
26390 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
263a0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
263b0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
263c0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
263d0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
263e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
263f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
26400 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
26410 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
26420 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
26430 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
26440 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
26450 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
26460 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
26470 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
26480 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
26490 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
264a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
264b0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
264c0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
264d0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
264e0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
264f0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
26500 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
26510 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
26520 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
26530 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
26540 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
26550 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
26560 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ent);.  if( rc==
26570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26580 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61   rc = btreePtrma
26590 70 42 65 67 69 6e 28 70 42 74 2c 20 69 53 74 61  pBegin(pBt, iSta
265a0 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  tement);.  }.  s
265b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
265c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
265d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
265e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
265f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
26600 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
26610 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
26620 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
26630 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
26640 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
26650 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
26660 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
26670 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
26680 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
26690 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
266a0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
266b0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
266c0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
266d0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
266e0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
266f0 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
26700 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
26710 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
26720 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
26730 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
26740 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
26750 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
26760 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
26770 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
26780 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
26790 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
267a0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
267b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
267c0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
267d0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
267e0 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
267f0 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
26800 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
26810 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
26820 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
26830 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
26840 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
26850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
26860 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
26870 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
26880 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
26890 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
268a0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
268b0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
268c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
268d0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
268e0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
268f0 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
26900 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
26910 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
26920 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
26930 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
26940 20 20 20 20 62 74 72 65 65 50 74 72 6d 61 70 45      btreePtrmapE
26950 6e 64 28 70 42 74 2c 20 6f 70 2c 20 69 53 61 76  nd(pBt, op, iSav
26960 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
26970 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
26980 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
26990 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
269a0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
269b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
269c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
269d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
269e0 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
269f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
26a00 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
26a10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
26a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26a30 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
26a40 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
26a50 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
26a60 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
26a70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
26a80 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
26a90 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
26aa0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
26ab0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
26ac0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
26ad0 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
26ae0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
26af0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
26b00 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
26b10 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
26b20 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
26b30 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
26b40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
26b50 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
26b60 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
26b70 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
26b80 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
26b90 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
26ba0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
26bb0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
26bc0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
26bd0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
26be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
26bf0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
26c00 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
26c10 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
26c20 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
26c30 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
26c40 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
26c50 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
26c60 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
26c70 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
26c80 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
26c90 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
26ca0 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
26cb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
26cc0 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
26cd0 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
26ce0 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
26cf0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
26d00 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
26d10 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
26d20 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
26d30 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53  f the BTREE_WRCS
26d40 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  R bit of wrFlag 
26d50 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74  is clear, then t
26d60 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
26d70 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f  ly.** be used fo
26d80 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74  r reading.  If t
26d90 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
26da0 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  it is set, then 
26db0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
26dc0 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
26dd0 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69  ading or for wri
26de0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
26df0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
26e00 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  ting.** are also
26e10 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65   met.  These are
26e20 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
26e30 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
26e40 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72   in order.** for
26e50 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61   writing to be a
26e60 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
26e70 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
26e80 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
26e90 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63  ed with wrFlag c
26ea0 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f  ontaining BTREE_
26eb0 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  WRCSR.**.** 2:  
26ec0 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
26ed0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
26ee0 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
26ef0 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
26f00 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
26f10 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
26f20 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
26f30 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
26f40 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
26f50 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
26f60 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
26f70 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
26f80 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
26f90 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
26fa0 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
26fb0 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
26fc0 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
26fd0 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
26fe0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
26ff0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
27000 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
27010 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
27020 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
27030 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
27040 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
27050 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
27060 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
27070 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45   The BTREE_FORDE
27080 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c  LETE bit of wrFl
27090 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c  ag may optionall
270a0 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45  y be set if BTRE
270b0 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65  E_WRCSR.** is se
270c0 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45  t.  If FORDELETE
270d0 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73   is set, that is
270e0 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
270f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
27100 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f  at.** this curso
27110 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75  r will only be u
27120 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61  sed to seek to a
27130 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65  nd delete entrie
27140 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  s of an index.**
27150 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61   as part of a la
27160 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74  rger DELETE stat
27170 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44  ement.  The FORD
27180 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f  ELETE hint is no
27190 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69  t used by.** thi
271a0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
271b0 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f  .  But in a hypo
271c0 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61  thetical alterna
271d0 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67  tive storage eng
271e0 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68  ine .** in which
271f0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
27200 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
27210 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f   deleted when co
27220 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
27230 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65  e.** rows are de
27240 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45  leted, the FORDE
27250 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68  LETE flag is a h
27260 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45  int that all SEE
27270 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20  K and DELETE.** 
27280 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68  operations on th
27290 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  is cursor can be
272a0 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20   no-ops and all 
272b0 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20  READ operations 
272c0 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  can .** return a
272d0 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74   null row (2-byt
272e0 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a  es: 0x01 0x00)..
272f0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
27300 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
27310 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
27320 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
27330 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
27340 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
27350 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
27360 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
27370 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
27380 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
27390 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
273a0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
273b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
273c0 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
273d0 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
273e0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
273f0 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
27400 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
27410 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
27420 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
27430 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
27440 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
27470 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
27480 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274a0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
274b0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
274c0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
274f0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
27500 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
27510 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
27520 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
27530 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
27540 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
27550 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
27560 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
27590 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
275a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
275b0 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
275c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
275d0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
275e0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
275f0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27610 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68  Looping over oth
27620 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a  er all cursors *
27630 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
27640 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
27650 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
27660 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20  rt( wrFlag==0 . 
27670 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
27680 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20  =BTREE_WRCSR .  
27690 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
276a0 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52  (BTREE_WRCSR|BTR
276b0 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20  EE_FORDELETE) . 
276c0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
276d0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
276e0 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
276f0 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
27700 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
27710 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
27720 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
27730 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
27740 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
27750 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
27760 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
27770 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
27780 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
27790 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
277a0 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
277b0 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
277c0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
277d0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
277e0 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
277f0 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29   (wrFlag?2:1)) )
27800 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
27810 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
27820 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
27830 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
27840 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
27850 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
27860 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
27870 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
27880 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
27890 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
278a0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
278b0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
278c0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
278d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
278e0 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
278f0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
27900 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
27910 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62  ag==0 || (pBt->b
27920 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
27930 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a  AD_ONLY)==0 );..
27940 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
27950 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
27960 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
27970 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
27980 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
27990 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
279a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
279b0 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
279c0 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
279d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
279e0 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
279f0 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
27a00 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
27a10 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
27a20 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
27a30 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
27a40 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
27a50 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
27a60 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
27a70 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
27a80 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
27a90 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
27aa0 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
27ab0 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
27ac0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
27ad0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
27ae0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
27af0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
27b00 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
27b10 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43  s = wrFlag ? BTC
27b20 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b  F_WriteFlag : 0;
27b30 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  .  pCur->curPage
27b40 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
27b50 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f  ? 0 : PAGER_GET_
27b60 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49  READONLY;.  /* I
27b70 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
27b80 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
27b90 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
27ba0 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
27bb0 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d  .  ** cursors *m
27bc0 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54  ust* have the BT
27bd0 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
27be0 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70   set. */.  for(p
27bf0 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  X=pBt->pCursor; 
27c00 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
27c10 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70  ){.    if( pX->p
27c20 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69  gnoRoot==(Pgno)i
27c30 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
27c40 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  X->curFlags |= B
27c50 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
27c60 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
27c70 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
27c80 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ple;.    }.  }. 
27c90 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
27ca0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70  Bt->pCursor;.  p
27cb0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
27cc0 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
27cd0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
27ce0 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  LID;.  return SQ
27cf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
27d00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
27d10 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d40 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
27d50 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27d80 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
27d90 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
27da0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27dd0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
27de0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
27df0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
27e00 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
27e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
27e20 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
27e30 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
27e40 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
27e70 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
27e80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
27e90 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b   if( iTable<1 ){
27ea0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
27eb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
27ed0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
27ee0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
27ef0 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
27f00 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
27f10 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73  fo, pCur);.    s
27f20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
27f30 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
27f40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
27f50 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
27f60 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
27f70 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
27f80 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
27f90 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
27fa0 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
27fb0 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
27fc0 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
27fd0 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
27fe0 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
27ff0 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
28000 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
28010 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
28020 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
28030 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
28040 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
28050 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
28060 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
28070 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
28080 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
28090 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
280a0 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
280b0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
280c0 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
280d0 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
280e0 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
280f0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
28100 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
28110 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
28120 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
28130 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
28140 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
28150 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
28160 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
28170 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
28180 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
28190 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
281a0 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
281b0 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
281c0 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
281d0 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
281e0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
281f0 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
28200 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
28210 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
28220 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
28230 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
28240 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
28250 72 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f 46  rsor, BTCURSOR_F
28260 49 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d  IRST_UNINIT));.}
28270 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
28280 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
28290 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
282a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
282b0 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
282c0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
282d0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
282e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
282f0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
28300 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
28310 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
28320 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
28330 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42   pBtree ){.    B
28340 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
28350 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
28360 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
28370 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
28380 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
28390 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
283a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
283b0 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
283c0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
283d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
283e0 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
283f0 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
28400 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
28410 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
28420 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
28430 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
28440 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
28450 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
28460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
28470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
28480 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
28490 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
284a0 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
284b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  );.    }.    btr
284c0 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
284d0 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
284e0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
284f0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
28500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
28510 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
28520 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28530 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
28540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
28550 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
28560 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28570 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
28580 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
28590 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
285a0 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
285b0 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
285c0 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
285d0 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
285e0 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
285f0 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
28600 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
28610 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
28620 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
28630 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
28640 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
28650 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
28660 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
28670 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
28680 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
28690 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
286a0 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
286b0 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
286c0 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61  int cellInfoEqua
286d0 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43  l(CellInfo *a, C
286e0 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20  ellInfo *b){.   
286f0 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d   if( a->nKey!=b-
28700 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30  >nKey ) return 0
28710 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61  ;.    if( a->pPa
28720 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f  yload!=b->pPaylo
28730 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ad ) return 0;. 
28740 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f     if( a->nPaylo
28750 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20  ad!=b->nPayload 
28760 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
28770 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62  if( a->nLocal!=b
28780 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72  ->nLocal ) retur
28790 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
287a0 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20  nSize!=b->nSize 
287b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
287c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
287d0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
287e0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
287f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
28800 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
28810 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
28820 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
28830 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
28840 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
28850 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e  e, pCur->ix, &in
28860 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
28870 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63   CORRUPT_DB || c
28880 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e  ellInfoEqual(&in
28890 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  fo, &pCur->info)
288a0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
288b0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
288c0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
288d0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
288e0 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
288f0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
28900 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
28910 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28920 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
28930 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
28940 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
28950 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
28960 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72  pCur->pPage,pCur
28970 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  ->ix,&pCur->info
28980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28990 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
289a0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
289b0 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
289c0 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
289d0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
289e0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
289f0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
28a00 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
28a10 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
28a20 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
28a30 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
28a40 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
28a50 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
28a60 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
28a70 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
28a80 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
28a90 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
28aa0 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
28ab0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
28ac0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
28ad0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
28ae0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
28af0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
28b00 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
28b10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28b20 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
28b30 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
28b40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28b50 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e  eCursorIsValidNN
28b60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
28b70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
28b80 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
28b90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28ba0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
28bb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28bc0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
28bd0 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77  eger key or "row
28be0 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20  id" for a table 
28bf0 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72  btree..** This r
28c00 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76  outine is only v
28c10 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f  alid for a curso
28c20 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
28c30 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64  ng into a.** ord
28c40 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65  inary table btre
28c50 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
28c60 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69  r points to an i
28c70 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a  ndex btree or.**
28c80 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   is invalid, the
28c90 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
28ca0 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66  routine is undef
28cb0 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ined..*/.i64 sql
28cc0 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
28cd0 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
28ce0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
28cf0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
28d00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28d10 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28d20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28d30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28d40 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
28d50 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
28d60 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
28d70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a  ->info.nKey;.}..
28d80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
28d90 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
28da0 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  FUNC./*.** Retur
28db0 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
28dc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28dd0 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ile for the star
28de0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c  t of the.** payl
28df0 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68 65  oad to which the
28e00 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
28e10 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ing..*/.i64 sqli
28e20 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42  te3BtreeOffset(B
28e30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28e40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28e50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
28e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28e70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28e80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
28e90 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
28ea0 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 70  .  return (i64)p
28eb0 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  Cur->pBt->pageSi
28ec0 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70  ze*((i64)pCur->p
28ed0 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20  Page->pgno - 1) 
28ee0 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34 29  +.         (i64)
28ef0 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  (pCur->info.pPay
28f00 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61  load - pCur->pPa
28f10 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65  ge->aData);.}.#e
28f20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
28f30 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
28f40 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _FUNC */../*.** 
28f50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
28f60 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
28f70 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
28f80 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
28f90 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
28fa0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
28fb0 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
28fc0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
28fd0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
28fe0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
28ff0 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
29000 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
29010 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
29020 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
29030 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
29040 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
29050 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
29060 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
29070 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
29080 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
29090 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
290a0 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
290b0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
290c0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
290d0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
290e0 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
290f0 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
29100 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
29110 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29120 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29130 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29140 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29150 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
29160 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
29170 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
29180 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
29190 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
291a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
291b0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
291c0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
291d0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
291e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
291f0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
29200 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
29210 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
29220 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
29230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
29240 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
29250 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
29260 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
29270 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
29280 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
29290 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
292a0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
292b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
292c0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
292d0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
292e0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
292f0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
29300 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
29310 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
29320 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
29330 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
29340 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
29350 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
29360 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
29370 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
29380 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
29390 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
293a0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
293b0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
293c0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
293d0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
293e0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
293f0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
29400 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
29410 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
29420 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
29430 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
29440 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
29450 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
29460 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
29470 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
29480 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
29490 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
294a0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
294b0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
294c0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
294d0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
294e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
294f0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
29500 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
29510 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
29520 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
29530 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
29540 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
29550 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
29560 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
29570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29580 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29590 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
295a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295b0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
295c0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
295d0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
295e0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
295f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
29600 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
29610 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
29620 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
29630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
29640 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
29650 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
29660 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
29670 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
29680 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
29690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
296a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
296b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
296c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
296d0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
296e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
296f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29700 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
29710 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
29720 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
29730 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
29740 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
29750 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
29760 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
29770 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
29780 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
29790 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
297a0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
297b0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
297c0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
297d0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
297e0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
297f0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
29800 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
29810 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
29820 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
29830 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
29840 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
29850 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
29860 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
29870 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
29880 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
29890 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
298a0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
298b0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
298c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
298d0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
298e0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
298f0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
29900 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
29910 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
29920 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
29930 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
29940 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
29950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29960 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
29970 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
29980 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
29990 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
299a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
299b0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
299c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
299d0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
299e0 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
299f0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
29a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29a10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
29a20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29a30 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
29a40 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
29a50 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
29a60 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
29a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
29a80 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
29a90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29aa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
29ab0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
29ac0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
29ad0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
29ae0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
29af0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
29b00 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
29b10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
29b20 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
29b30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
29b40 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
29b50 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
29b60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
29b70 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
29b80 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
29b90 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
29ba0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
29bb0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
29bc0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
29bd0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
29be0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
29bf0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
29c00 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
29c10 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
29c20 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
29c30 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
29c40 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
29c50 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
29c60 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
29c70 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
29c80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
29c90 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
29ca0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
29cb0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
29cc0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
29cd0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
29ce0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
29cf0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
29d00 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
29d10 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
29d20 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
29d30 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
29d40 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
29d50 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
29d60 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
29d70 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
29d80 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
29d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29da0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
29db0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
29de0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
29df0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
29e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
29e10 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
29e20 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
29e30 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
29e40 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
29e50 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
29e60 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
29e70 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
29e80 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
29e90 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
29ea0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
29eb0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
29ec0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29ed0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
29ee0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
29ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29f10 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
29f20 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
29f30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
29f40 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
29f50 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
29f60 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
29f70 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
29f80 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
29f90 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
29fa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
29fb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29fc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
29fd0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
29fe0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
29ff0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
2a000 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
2a010 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
2a020 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2a030 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
2a040 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
2a050 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
2a060 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
2a070 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
2a080 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
2a090 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
2a0a0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
2a0b0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
2a0c0 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
2a0d0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
2a0e0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
2a0f0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
2a100 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
2a110 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
2a120 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
2a130 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
2a140 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
2a150 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
2a160 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
2a170 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
2a180 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
2a190 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
2a1a0 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
2a1b0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
2a1c0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
2a1d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
2a1e0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
2a1f0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
2a200 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2a210 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ages.** this fun
2a220 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
2a230 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
2a240 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
2a250 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  .** the overflow
2a260 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
2a270 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
2a280 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
2a290 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
2a2a0 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
2a2b0 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
2a2c0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
2a2d0 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
2a2e0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
2a2f0 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
2a300 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
2a310 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
2a320 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62  cated, it must b
2a330 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
2a340 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
2a350 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
2a360 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
2a370 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
2a380 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
2a390 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
2a3a0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
2a3b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
2a3c0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
2a3d0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
2a3e0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
2a3f0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2a400 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
2a410 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
2a420 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
2a430 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
2a440 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
2a450 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
2a460 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
2a470 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
2a480 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2a490 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
2a4a0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
2a4b0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2a4c0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
2a4d0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
2a4e0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
2a4f0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
2a500 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
2a510 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
2a520 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
2a530 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
2a540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2a550 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
2a560 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
2a570 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
2a580 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
2a590 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
2a5a0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5c0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
2a5d0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
2a5e0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
2a5f0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
2a600 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2a610 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
2a620 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
2a630 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2a640 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >pPage;         
2a650 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70        /* Btree p
2a660 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
2a670 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
2a680 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
2a690 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
2a6a0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
2a6b0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
2a6c0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
2a6d0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
2a6e0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
2a6f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
2a700 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
2a710 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61  pBuf;     /* Sta
2a720 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f  rt of original o
2a730 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e  ut buffer */.#en
2a740 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
2a750 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
2a760 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d  ( eOp==0 || eOp=
2a770 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2a780 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a790 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a7a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2a7b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2a7c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a7d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2a7e0 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
2a7f0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
2a800 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
2a810 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61  fo.pPayload;.  a
2a820 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
2a830 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
2a840 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61  nPayload );..  a
2a850 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20  ssert( aPayload 
2a860 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  > pPage->aData )
2a870 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61  ;.  if( (uptr)(a
2a880 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d  Payload - pPage-
2a890 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e  >aData) > (pBt->
2a8a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75  usableSize - pCu
2a8b0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  r->info.nLocal) 
2a8c0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
2a8d0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
2a8e0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
2a8f0 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
2a900 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20   error.  The.   
2a910 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   ** conditional 
2a920 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a  above is really:
2a930 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79  .    **    &aPay
2a940 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
2a950 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
2a960 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
2a970 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20  bleSize].    ** 
2a980 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e  but is recast in
2a990 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66  to its current f
2a9a0 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74  orm to avoid int
2a9b0 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72  eger overflow pr
2a9c0 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20  oblems.    */.  
2a9d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a9e0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
2a9f0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ge);.  }..  /* C
2aa00 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
2aa10 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
2aa20 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
2aa30 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
2aa40 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
2aa50 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
2aa60 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
2aa70 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
2aa80 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
2aa90 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
2aaa0 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
2aab0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
2aac0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
2aad0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
2aae0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
2aaf0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
2ab00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2ab10 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
2ab20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
2ab30 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
2ab40 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
2ab50 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
2ab60 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
2ab70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ab80 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
2ab90 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
2aba0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
2abb0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
2abc0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
2abd0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
2abe0 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
2abf0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
2ac00 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
2ac10 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
2ac20 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
2ac30 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
2ac40 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
2ac50 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
2ac60 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
2ac70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   now..    **.   
2ac80 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
2ac90 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
2aca0 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
2acb0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
2acc0 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
2acd0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
2ace0 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
2acf0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
2ad00 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
2ad10 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
2ad20 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
2ad30 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
2ad40 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
2ad50 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
2ad60 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
2ad70 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
2ad80 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
2ad90 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
2ada0 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
2adb0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2adc0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2add0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
2ade0 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
2adf0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
2ae00 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
2ae10 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
2ae20 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2ae30 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20  >aOverflow==0.  
2ae40 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69       || nOvfl*(i
2ae50 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20  nt)sizeof(Pgno) 
2ae60 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  > sqlite3MallocS
2ae70 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ize(pCur->aOverf
2ae80 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  low).      ){.  
2ae90 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
2aea0 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
2aeb0 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
2aec0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
2aed0 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
2aee0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
2aef0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
2af00 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
2af10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2af20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2af30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2af40 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2af50 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
2af60 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
2af70 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
2af80 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
2af90 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
2afa0 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
2afb0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2afc0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
2afd0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
2afe0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
2aff0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2b000 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
2b010 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
2b020 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79  e.      ** entry
2b030 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
2b040 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
2b050 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
2b060 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69  skip.      ** di
2b070 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
2b080 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2b090 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2b0a0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
2b0b0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64  ] ){.        iId
2b0c0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
2b0d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Size);.        n
2b0e0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
2b0f0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
2b100 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
2b110 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
2b120 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
2b130 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
2b140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b150 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68   amt>0 );.    wh
2b160 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b  ile( nextPage ){
2b170 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
2b180 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
2b190 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2b1a0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
2b1b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b1c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
2b1d0 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
2b1e0 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61        || pCur->a
2b1f0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
2b200 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20  nextPage.       
2b210 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
2b220 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43  T_DB );.      pC
2b230 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
2b240 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
2b250 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
2b260 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
2b270 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
2b280 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
2b290 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
2b2a0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
2b2b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2b2c0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
2b2d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
2b2e0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
2b2f0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2b300 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
2b310 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
2b320 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
2b330 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
2b340 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
2b350 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
2b360 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
2b370 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
2b380 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
2b390 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
2b3a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
2b3b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
2b3c0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2b3d0 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
2b3e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b3f0 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
2b400 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
2b410 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
2b420 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
2b430 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
2b440 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
2b450 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
2b460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b470 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2b480 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
2b490 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
2b4a0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
2b4b0 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
2b4c0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
2b4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b4e0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
2b4f0 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
2b500 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
2b510 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
2b520 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
2b530 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
2b540 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
2b550 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
2b560 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
2b570 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2b580 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
2b590 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
2b5a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
2b5b0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72        /* File fr
2b5c0 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64  om which to do d
2b5d0 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72  irect overflow r
2b5e0 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
2b5f0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
2b600 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
2b610 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
2b620 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2b630 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
2b640 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
2b650 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
2b660 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
2b670 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
2b680 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
2b690 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2b6a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2b6b0 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
2b6c0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
2b6d0 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
2b6e0 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
2b6f0 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
2b700 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2b710 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
2b720 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
2b730 20 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e     3) there is n
2b740 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61  o open write-tra
2b750 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
2b760 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
2b770 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
2b780 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
2b790 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
2b7a0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2b7b0 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20  n the WAL file. 
2b7c0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
2b7d0 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
2b7e0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
2b7f0 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
2b800 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
2b810 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2b820 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
2b830 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
2b840 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
2b850 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
2b860 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
2b870 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
2b880 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
2b890 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
2b8a0 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
2b8b0 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
2b8c0 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
2b8d0 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
2b8e0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2b8f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2b900 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2b940 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
2b950 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
2b990 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
2b9a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
2b9b0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b9d0 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
2b9e0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
2b9f0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
2ba00 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
2ba10 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f  ds     /* (4) */
2ba20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
2ba30 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57  sqlite3PagerUseW
2ba40 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
2ba50 6e 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20  nextPage)       
2ba60 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
2ba70 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
2ba80 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
2bab0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
2bac0 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
2bad0 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
2bae0 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
2baf0 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
2bb00 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
2bb10 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb30 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20        /* due to 
2bb40 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
2bb50 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
2bb60 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
2bb70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bb80 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
2bb90 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
2bba0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
2bbb0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
2bbc0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2bbd0 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
2bbe0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2bbf0 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
2bc00 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
2bc10 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
2bc20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2bc30 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
2bc40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bc50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2bc60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
2bc70 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
2bc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
2bc90 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  eOp==0 ? PAGER_G
2bca0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
2bcb0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
2bcc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2bcd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bce0 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
2bcf0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
2bd00 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
2bd10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
2bd20 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
2bd30 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
2bd40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
2bd50 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
2bd60 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
2bd70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
2bd80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2bd90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2bda0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
2bdb0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
2bdc0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2bdd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2bde0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
2bdf0 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d         if( amt==
2be00 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
2be10 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
2be20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2be30 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2be40 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20        iIdx++;.  
2be50 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
2be60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2be70 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  amt>0 ){.    /* 
2be80 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65  Overflow chain e
2be90 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20  nds prematurely 
2bea0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
2beb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
2bec0 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
2bed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bee0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
2bef0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
2bf00 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
2bf10 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
2bf20 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
2bf30 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
2bf40 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
2bf50 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
2bf60 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
2bf70 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
2bf80 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
2bf90 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
2bfa0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
2bfb0 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
2bfc0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
2bfd0 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
2bfe0 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
2bff0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
2c000 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
2c010 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
2c020 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
2c030 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
2c040 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
2c050 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
2c060 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
2c070 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
2c080 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
2c090 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
2c0a0 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
2c0b0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
2c0c0 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
2c0d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2c0e0 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
2c0f0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
2c100 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
2c110 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
2c120 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
2c130 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
2c140 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
2c150 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
2c160 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
2c170 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
2c180 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
2c190 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2c1a0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
2c1b0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
2c1c0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
2c1d0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
2c1e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
2c1f0 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
2c200 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
2c210 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
2c220 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
2c230 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2c240 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2c250 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c260 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c280 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
2c290 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
2c2a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2c2b0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
2c2c0 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
2c2d0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2c2e0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
2c2f0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2c300 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
2c310 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74  .** This variant
2c320 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
2c330 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20  Payload() works 
2c340 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73  even if the curs
2c350 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e  or has not.** in
2c360 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49   the CURSOR_VALI
2c370 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20  D state.  It is 
2c380 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
2c390 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
2c3a0 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ad().** interfac
2c3b0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
2c3c0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2c3d0 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  OB.static SQLITE
2c3e0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63  _NOINLINE int ac
2c3f0 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
2c400 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2c410 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73  pCur,.  u32 offs
2c420 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20  et,.  u32 amt,. 
2c430 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20   void *pBuf.){. 
2c440 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20   int rc;.  if ( 
2c450 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c460 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
2c470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c480 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61  E_ABORT;.  }.  a
2c490 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2c4a0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2c4b0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52  );.  rc = btreeR
2c4c0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2c4d0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65  tion(pCur);.  re
2c4e0 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61  turn rc ? rc : a
2c4f0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
2c500 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
2c510 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  pBuf, 0);.}.int 
2c520 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2c530 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72  oadChecked(BtCur
2c540 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
2c550 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
2c560 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
2c570 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2c580 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2c590 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72  .    assert( cur
2c5a0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2c5b0 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74  pCur) );.    ret
2c5c0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
2c5d0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
2c5e0 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
2c5f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2c600 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
2c610 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66  Checked(pCur, of
2c620 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29  fset, amt, pBuf)
2c630 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
2c640 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
2c650 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
2c660 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2c670 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
2c680 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2c690 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2c6a0 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
2c6b0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
2c6c0 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
2c6d0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
2c6e0 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
2c6f0 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
2c700 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
2c710 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
2c720 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
2c730 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
2c740 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
2c750 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2c760 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
2c770 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
2c780 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
2c790 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
2c7a0 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
2c7b0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
2c7c0 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
2c7d0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
2c7e0 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
2c7f0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
2c800 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
2c810 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
2c820 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
2c830 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
2c840 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
2c850 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
2c860 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
2c870 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
2c880 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
2c890 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
2c8a0 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
2c8b0 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
2c8c0 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
2c8d0 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
2c8e0 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
2c8f0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2c900 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
2c910 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
2c920 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
2c930 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
2c940 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
2c950 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
2c960 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
2c970 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
2c980 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
2c990 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
2c9a0 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
2c9b0 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
2c9c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
2c9d0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
2c9e0 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
2c9f0 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
2ca00 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
2ca10 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
2ca20 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
2ca30 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
2ca40 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2ca50 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2ca60 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
2ca70 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
2ca80 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
2ca90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2caa0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2cab0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2cac0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2cad0 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
2cae0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
2caf0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
2cb00 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73 73  r->pPage);.  ass
2cb10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2cb20 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2cb30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2cb40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2cb50 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2cb60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2cb70 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2cb80 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2cb90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2cba0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2cbb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
2cbc0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2cbd0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
2cbe0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2cbf0 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70  pPayload>pCur->p
2cc00 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43  Page->aData || C
2cc10 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
2cc20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2cc30 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
2cc40 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2cc50 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
2cc60 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e    amt = pCur->in
2cc70 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28  fo.nLocal;.  if(
2cc80 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72 2d   amt>(int)(pCur-
2cc90 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2cca0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
2ccb0 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f  ayload) ){.    /
2ccc0 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20 6c  * There is too l
2ccd0 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20 74  ittle space on t
2cce0 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  he page for the 
2ccf0 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a  expected amount.
2cd00 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20      ** of local 
2cd10 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61 73  content. Databas
2cd20 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2cd30 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
2cd40 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  ( CORRUPT_DB );.
2cd50 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c      amt = MAX(0,
2cd60 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61   (int)(pCur->pPa
2cd70 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
2cd80 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2cd90 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ad));.  }.  *pAm
2cda0 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20 20  t = (u32)amt;.  
2cdb0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
2cdc0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2cdd0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
2cde0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
2cdf0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
2ce00 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
2ce10 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
2ce20 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
2ce30 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
2ce40 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
2ce50 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
2ce60 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
2ce70 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
2ce80 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
2ce90 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
2cea0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
2ceb0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
2cec0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
2ced0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
2cee0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
2cef0 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
2cf00 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
2cf10 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
2cf20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
2cf30 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
2cf40 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
2cf50 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
2cf60 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
2cf70 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
2cf80 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
2cf90 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
2cfa0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2cfb0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
2cfc0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
2cfd0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
2cfe0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
2cff0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
2d000 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2d010 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
2d020 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
2d030 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42  eePayloadFetch(B
2d040 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2d050 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
2d060 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
2d070 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
2d080 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2d090 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2d0a0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2d0b0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
2d0c0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
2d0d0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
2d0e0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2d0f0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
2d100 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2d110 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
2d120 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
2d130 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2d140 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
2d150 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
2d160 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
2d170 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
2d180 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
2d190 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
2d1a0 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
2d1b0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
2d1c0 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
2d1d0 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
2d1e0 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
2d1f0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
2d200 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
2d210 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
2d220 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d230 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
2d240 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
2d250 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2d260 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2d270 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d280 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d290 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2d2a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
2d2b0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
2d2c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d2d0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
2d2e0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2d2f0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
2d300 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
2d310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2d320 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2d330 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2d340 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2d350 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2d360 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2d370 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2d380 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d390 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
2d3a0 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50  >ix;.  pCur->apP
2d3b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d3c0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2d3d0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a    pCur->ix = 0;.
2d3e0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
2d3f0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
2d400 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
2d410 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  gno, &pCur->pPag
2d420 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2d430 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2c             pCur,
2d440 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
2d450 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
2d460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d470 20 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74    setMempageRoot
2d480 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
2d490 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  ur->pgnoRoot);. 
2d4a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2d4b0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2d4c0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
2d4d0 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
2d4e0 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
2d4f0 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
2d500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
2d510 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
2d520 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
2d530 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
2d540 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
2d550 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
2d560 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
2d570 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
2d580 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
2d590 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
2d5a0 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
2d5b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
2d5c0 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
2d5d0 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
2d5e0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
2d5f0 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
2d600 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
2d610 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
2d620 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
2d630 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
2d640 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
2d650 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
2d660 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
2d670 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
2d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d690 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
2d6a0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
2d6b0 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
2d6c0 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
2d6d0 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
2d6e0 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
2d6f0 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
2d700 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
2d710 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2d720 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2d730 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
2d740 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2d750 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
2d760 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
2d770 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
2d780 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
2d790 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
2d7a0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
2d7b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
2d7c0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
2d7d0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2d7e0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
2d7f0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
2d800 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
2d810 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2d820 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
2d830 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
2d840 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
2d850 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2d860 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
2d870 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
2d880 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
2d890 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
2d8a0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
2d8b0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
2d8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d8d0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
2d8e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2d8f0 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a  MemPage *pLeaf;.
2d900 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d910 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2d920 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d930 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d940 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2d950 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2d960 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
2d970 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
2d980 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
2d990 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
2d9a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d9b0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
2d9c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d9d0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
2d9e0 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ur->pPage->pgno.
2d9f0 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28    );.  testcase(
2da00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2da10 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
2da20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2da30 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
2da40 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2da50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2da60 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2da70 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2da80 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2da90 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70  ;.  pCur->ix = p
2daa0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2dab0 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65  >iPage-1];.  pLe
2dac0 61 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  af = pCur->pPage
2dad0 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
2dae0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d  = pCur->apPage[-
2daf0 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  -pCur->iPage];. 
2db00 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2db10 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f  ull(pLeaf);.}../
2db20 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2db30 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
2db40 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2db50 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
2db60 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
2db70 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
2db80 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2db90 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
2dba0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
2dbb0 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
2dbc0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2dbd0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
2dbe0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
2dbf0 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
2dc00 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
2dc10 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
2dc20 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
2dc30 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
2dc40 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
2dc50 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
2dc60 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
2dc70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
2dc80 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
2dc90 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
2dca0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2dcb0 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
2dcc0 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
2dcd0 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
2dce0 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20 74  OR_INVALID and t
2dcf0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2dd00 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  rns SQLITE_EMPTY
2dd10 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
2dd20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
2dd30 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2dd40 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63  e first cell loc
2dd50 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
2dd60 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c 20  .** (or virtual 
2dd70 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
2dd80 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
2dd90 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
2dda0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
2ddb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2ddc0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
2ddd0 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
2dde0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
2ddf0 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
2de00 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
2de10 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
2de20 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
2de30 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
2de40 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
2de50 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
2de60 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
2de70 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
2de80 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
2de90 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
2dea0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
2deb0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
2dec0 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
2ded0 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
2dee0 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
2def0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
2df00 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
2df10 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
2df20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
2df30 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
2df40 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
2df50 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
2df60 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
2df70 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
2df80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2df90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
2dfa0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
2dfb0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2dfc0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2dfd0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2dfe0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2dff0 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
2e000 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2e010 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2e020 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
2e030 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2e040 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2e050 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
2e060 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2e070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e080 72 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52 53  r->eState < CURS
2e090 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 7c  OR_REQUIRESEEK |
2e0a0 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20  | pCur->iPage<0 
2e0b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e0c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c  r->pgnoRoot>0 ||
2e0d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29   pCur->iPage<0 )
2e0e0 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ;..  if( pCur->i
2e0f0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
2e100 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29  f( pCur->iPage )
2e110 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2e120 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2e130 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 77  >pPage);.      w
2e140 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50  hile( --pCur->iP
2e150 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
2e160 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2e170 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
2e180 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
2e190 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2e1a0 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
2e1b0 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20  apPage[0];.     
2e1c0 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b   goto skip_init;
2e1d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2e1e0 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
2e1f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
2e200 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2e210 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
2e220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50  eturn SQLITE_EMP
2e230 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TY;.  }else{.   
2e240 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2e250 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
2e260 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2e270 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
2e280 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20 20  RESEEK ){.      
2e290 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2e2a0 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2e2b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2e2c0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e2d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2e2e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
2e2f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
2e300 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2e310 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
2e320 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  sor(pCur);.    }
2e330 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2e340 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70  InitPage(pCur->p
2e350 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72  Btree->pBt, pCur
2e360 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
2e370 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20  r->pPage,.      
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
2e3a0 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
2e3b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e3c0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
2e3d0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2e3e0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
2e3f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e400 20 20 20 20 73 65 74 4d 65 6d 70 61 67 65 52 6f      setMempageRo
2e410 6f 74 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ot(pCur->pPage, 
2e420 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 3b  pCur->pgnoRoot);
2e430 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
2e440 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
2e450 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
2e460 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b  ->pPage->intKey;
2e470 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
2e480 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2e490 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
2e4a0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
2e4b0 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
2e4c0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
2e4d0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2e4e0 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
2e4f0 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
2e500 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
2e510 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
2e520 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
2e530 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
2e540 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
2e550 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
2e560 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
2e570 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
2e580 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
2e590 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
2e5a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
2e5b0 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
2e5c0 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
2e5d0 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
2e5e0 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
2e5f0 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
2e600 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
2e610 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
2e620 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
2e630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
2e640 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
2e650 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
2e660 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
2e670 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
2e680 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2e690 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
2e6a0 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
2e6b0 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
2e6c0 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
2e6d0 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
2e6e0 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
2e6f0 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
2e700 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
2e710 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
2e720 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
2e730 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
2e740 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
2e750 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
2e760 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
2e770 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e780 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43  _CORRUPT_PAGE(pC
2e790 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ur->pPage);.  }.
2e7a0 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
2e7b0 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2e7c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e7d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2e7e0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2e7f0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2e800 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2e810 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74  dOvfl);..  pRoot
2e820 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2e830 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
2e840 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
2e850 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2e860 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
2e870 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
2e880 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
2e890 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
2e8a0 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
2e8b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2e8c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e8d0 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
2e8e0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
2e8f0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
2e900 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2e910 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2e920 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
2e930 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2e940 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
2e950 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
2e960 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2e970 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  INVALID;.    rc 
2e980 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
2e990 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2e9b0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2e9c0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
2e9d0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2e9e0 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
2e9f0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2ea00 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2ea10 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
2ea20 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
2ea30 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2ea40 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
2ea50 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
2ea60 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2ea70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2ea80 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
2ea90 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2eaa0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2eab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2eac0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2ead0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2eae0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2eaf0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2eb00 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2eb10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2eb20 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
2eb30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
2eb40 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2eb50 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
2eb60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2eb70 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2eb80 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2eb90 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2eba0 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b  age, pCur->ix));
2ebb0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2ebc0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2ebd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ebe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2ebf0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2ec00 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
2ec10 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2ec20 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
2ec30 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
2ec40 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2ec50 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
2ec60 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
2ec70 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
2ec80 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
2ec90 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
2eca0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2ecb0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
2ecc0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
2ecd0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
2ece0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
2ecf0 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
2ed00 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
2ed10 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2ed20 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
2ed30 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
2ed40 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
2ed50 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
2ed60 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
2ed70 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
2ed80 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2ed90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2eda0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
2edb0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2edc0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2edd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ede0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2edf0 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
2ee00 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2ee10 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2ee20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2ee30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2ee40 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2ee50 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2ee60 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2ee70 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2ee80 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2ee90 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2eea0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2eeb0 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2eec0 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
2eed0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2eee0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2eef0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ef00 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20   }.  pCur->ix = 
2ef10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2ef20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ef30 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2ef40 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2ef50 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2ef60 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
2ef70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2ef80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
2ef90 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2efa0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2efb0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2efc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2efd0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2efe0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2eff0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2f000 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2f010 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2f020 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2f030 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2f040 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2f050 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
2f060 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2f070 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2f080 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2f090 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2f0a0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2f0b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f0c0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2f0d0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2f0e0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
2f0f0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2f100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f110 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2f120 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2f130 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52  ell>0 );.    *pR
2f140 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2f150 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2f160 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  pCur);.  }else i
2f170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2f180 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PTY ){.    asser
2f190 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2f1a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2f1b0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2f1c0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
2f1d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f1e0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2f1f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2f200 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2f210 20 6e 6f 2d 6f 70 20 69 66 20 63 75 72 73 6f 72   no-op if cursor
2f220 20 70 43 75 72 20 64 6f 65 73 20 6e 6f 74 20 70   pCur does not p
2f230 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20  oint to a valid 
2f240 72 6f 77 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  row..** Otherwis
2f250 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 76 61  e, if pCur is va
2f260 6c 69 64 2c 20 63 6f 6e 66 69 67 75 72 65 20 69  lid, configure i
2f270 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  t so that the ne
2f280 78 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  xt call to.** sq
2f290 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2f2a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
2f2b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f2c0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 76  MIT_WINDOWFUNC.v
2f2d0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
2f2e0 53 6b 69 70 4e 65 78 74 28 42 74 43 75 72 73 6f  SkipNext(BtCurso
2f2f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 57  r *pCur){.  /* W
2f300 65 20 62 65 6c 69 65 76 65 20 74 68 61 74 20 74  e believe that t
2f310 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 61  he cursor must a
2f320 6c 77 61 79 73 20 62 65 20 69 6e 20 74 68 65 20  lways be in the 
2f330 76 61 6c 69 64 20 73 74 61 74 65 20 77 68 65 6e  valid state when
2f340 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .  ** this routi
2f350 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75  ne is called, bu
2f360 74 20 74 68 65 20 70 72 6f 6f 66 20 69 73 20 64  t the proof is d
2f370 69 66 66 69 63 75 6c 74 2c 20 73 6f 20 77 65 20  ifficult, so we 
2f380 61 64 64 20 61 6e 0a 20 20 2a 2a 20 41 4c 57 61  add an.  ** ALWa
2f390 59 53 28 29 20 74 65 73 74 20 6a 75 73 74 20 69  YS() test just i
2f3a0 6e 20 63 61 73 65 20 77 65 20 61 72 65 20 77 72  n case we are wr
2f3b0 6f 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c  ong. */.  if( AL
2f3c0 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
2f3d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
2f3e0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
2f3f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
2f400 49 50 4e 45 58 54 3b 0a 20 20 20 20 70 43 75 72  IPNEXT;.    pCur
2f410 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 31 3b 0a  ->skipNext = 1;.
2f420 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
2f430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
2f440 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4d 6f  OWFUNC */../* Mo
2f450 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2f460 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2f470 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2f480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2f490 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2f4a0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2f4b0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2f4c0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2f4d0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2f4e0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2f4f0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2f500 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2f510 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
2f520 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2f530 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2f540 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
2f550 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2f560 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2f570 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f580 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2f590 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2f5a0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2f5b0 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
2f5c0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
2f5d0 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
2f5e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
2f5f0 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
2f600 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2f610 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2f620 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2f630 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
2f640 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2f650 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
2f660 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
2f670 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2f680 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
2f690 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
2f6a0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2f6b0 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
2f6c0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
2f6d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
2f6e0 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
2f6f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2f700 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
2f710 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
2f720 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
2f730 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2f740 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67  ->ix==pCur->pPag
2f750 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  e->nCell-1 );.  
2f760 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f770 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23  pPage->leaf );.#
2f780 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
2f790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2f7a0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2f7b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2f7c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f7d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2f7e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2f7f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a  R_VALID );.    *
2f800 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  pRes = 0;.    rc
2f810 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2f820 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  st(pCur);.    if
2f830 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f840 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  ){.      pCur->c
2f850 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2f860 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73  AtLast;.    }els
2f870 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e{.      pCur->c
2f880 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2f890 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20  _AtLast;.    }. 
2f8a0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2f8b0 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2f8c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2f8d0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2f8e0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2f8f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
2f900 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
2f910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2f920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f930 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2f940 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2f950 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2f960 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2f970 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2f980 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2f990 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2f9a0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2f9b0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2f9c0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2f9d0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2f9e0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2f9f0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2fa00 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2fa10 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2fa20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2fa30 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2fa40 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2fa50 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2fa60 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2fa70 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2fa80 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2fa90 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2faa0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2fab0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2fac0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2fad0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2fae0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2faf0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2fb00 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2fb10 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2fb20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2fb30 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2fb40 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2fb50 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2fb60 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2fb70 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2fb80 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2fb90 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2fba0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2fbb0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2fbc0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2fbd0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2fbe0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2fbf0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2fc00 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2fc10 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2fc20 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2fc30 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2fc40 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2fc50 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2fc60 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2fc70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2fc80 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2fc90 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2fca0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2fcb0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2fcc0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2fcd0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2fce0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2fcf0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2fd10 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2fd20 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2fd30 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2fd40 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2fd50 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2fd60 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2fd70 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2fd80 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2fd90 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2fda0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2fdb0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2fdc0 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2fdd0 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2fde0 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2fdf0 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2fe00 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2fe10 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2fe20 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2fe30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2fe40 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2fe50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2fe60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fe70 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2fe80 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2fe90 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2fea0 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2feb0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2fec0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2fed0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2fee0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2fef0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2ff00 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2ff10 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2ff20 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2ff30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ff50 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2ff60 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2ff70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2ff80 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2ff90 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2ffa0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ffb0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ffc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ffd0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ffe0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2fff0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
30000 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
30010 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
30020 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
30030 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
30040 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
30050 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
30060 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
30070 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
30080 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
30090 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
300a0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
300b0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
300c0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
300d0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
300e0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
300f0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
30100 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
30110 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
30120 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
30130 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
30140 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
30150 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
30160 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
30170 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
30180 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
30190 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
301a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
301b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
301c0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
301d0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
301e0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
301f0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
30200 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
30210 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
30220 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
30230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30240 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
30250 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
30260 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
30270 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
30280 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
30290 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
302a0 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
302b0 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
302c0 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
302d0 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
302e0 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
302f0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
30300 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
30310 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
30320 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
30330 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
30340 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20  is case, only a 
30350 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77  little more slow
30360 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ely */.      if(
30370 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
30380 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70  +1==intKey && !p
30390 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
303a0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
303b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
303c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
303d0 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
303e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
303f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30400 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
30410 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
30420 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
30430 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
30440 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
30450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
30460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30470 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
30480 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
30490 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
304a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
304b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
304c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
304d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
304e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
304f0 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
30500 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
30510 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
30520 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
30530 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
30540 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
30550 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
30560 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
30570 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
30580 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
30590 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
305a0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
305b0 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
305c0 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
305d0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
305e0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
305f0 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
30600 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
30610 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
30620 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
30630 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a  SQLITE_EMPTY ){.
30640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
30650 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
30660 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
30670 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
30680 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
30690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
306a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
306b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
306c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
306d0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
306e0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
306f0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
30700 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
30710 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
30720 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
30730 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20  >pPage->nCell > 
30740 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
30750 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c  Cur->iPage==0 ||
30760 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
30770 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e  ->intKey==pCur->
30780 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61  curIntKey );.  a
30790 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
307a0 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  IntKey || pIdxKe
307b0 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
307c0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
307d0 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
307e0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
307f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
30800 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
30810 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30830 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
30840 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
30850 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
30860 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
30870 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
30880 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
30890 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
308a0 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
308b0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
308c0 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
308d0 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
308e0 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
308f0 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
30900 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
30910 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
30920 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
30930 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
30940 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
30950 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
30960 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
30970 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
30980 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
30990 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
309a0 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
309b0 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
309c0 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
309d0 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
309e0 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
309f0 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
30a00 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
30a10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30a20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
30a30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30a40 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
30a50 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
30a60 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
30a70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
30a80 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
30a90 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
30aa0 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
30ab0 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
30ac0 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
30ad0 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
30ae0 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
30af0 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
30b00 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
30b10 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
30b20 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
30b30 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
30b40 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
30b50 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
30b60 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
30b70 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
30b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
30b90 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
30ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
30bb0 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
30bc0 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
30bd0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
30be0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
30bf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
30c10 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
30c20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30c30 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30c50 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
30c60 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
30c70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
30c80 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
30c90 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
30ca0 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
30cb0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
30cc0 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
30cd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
30ce0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
30cf0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
30d00 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
30d10 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
30d20 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
30d30 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
30d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30d50 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
30d60 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
30d70 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
30d80 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
30d90 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
30da0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
30db0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
30dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
30dd0 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
30de0 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
30df0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30e00 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
30e10 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
30e20 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
30e30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
30e40 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
30e50 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
30e60 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
30e70 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
30e80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30ea0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
30eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30ec0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
30ed0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
30ee0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
30ef0 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
30f00 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
30f10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
30f20 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
30f30 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
30f40 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  l;  /* Size of t
30f50 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e  he pCell cell in
30f60 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
30f70 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
30f80 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
30f90 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20   idx);..        
30fa0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
30fb0 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
30fc0 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
30fd0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
30fe0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
30ff0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
31000 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
31010 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
31020 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
31030 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
31040 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
31050 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
31060 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
31070 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
31080 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
31090 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
310a0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
310b0 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
310c0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
310d0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
310e0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
310f0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
31100 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
31110 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
31120 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
31130 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
31140 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
31150 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
31160 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
31170 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31180 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
31190 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
311a0 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
311b0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
311c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
311d0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
311e0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
311f0 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
31200 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
31210 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
31220 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
31230 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
31240 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
31250 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
31260 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
31270 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
31280 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
31290 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
312a0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
312b0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
312c0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
312d0 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
312e0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
312f0 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
31300 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
31310 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
31320 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
31330 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
31340 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
31350 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
31360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
31370 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
31380 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
31390 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
313a0 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
313b0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
313c0 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
313d0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
313e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
313f0 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
31400 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
31410 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
31420 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
31430 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
31440 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
31450 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
31460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31470 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
31480 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
31490 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
314a0 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
314b0 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
314c0 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
314d0 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
314e0 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
314f0 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
31500 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
31510 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
31520 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
31530 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
31540 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
31550 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
31560 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
31570 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
31580 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
31590 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
315a0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
315b0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
315c0 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
315d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
315e0 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
315f0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
31600 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
31610 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
31620 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
31630 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
31640 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
31650 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
31660 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
31670 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
31680 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
31690 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
316a0 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
316b0 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
316c0 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
316d0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
316e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
316f0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
31700 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
31710 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
31720 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
31730 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
31740 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
31750 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
31760 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
31770 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
31780 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
31790 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
317a0 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
317b0 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
317c0 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
317d0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
317e0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
317f0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
31800 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
31810 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
31820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
31830 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
31840 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
31850 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
31860 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
31870 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<2 ){.         
31880 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31890 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
318a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
318b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
318c0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
318d0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
318e0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
318f0 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
31900 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
31910 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
31920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31930 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
31940 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
31950 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
31960 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31970 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
31980 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
31990 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
319a0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
319b0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
319c0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
319d0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
319e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
319f0 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
31a00 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  fl;.          if
31a10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
31a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
31a30 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
31a40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
31a50 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
31a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31a70 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
31a80 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
31a90 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
31aa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31ab0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
31ac0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31ad0 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
31ae0 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
31af0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
31b00 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
31b10 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
31b20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
31b30 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
31b40 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
31b50 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
31b60 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
31b70 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
31b80 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
31b90 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
31ba0 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
31bb0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
31bc0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
31bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31be0 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
31bf0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
31c00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31c20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
31c30 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
31c40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
31c50 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
31c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31c70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
31c80 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
31c90 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
31ca0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
31cb0 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
31cc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
31cd0 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
31ce0 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
31cf0 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
31d00 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
31d10 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
31d20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
31d30 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
31d40 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
31d50 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
31d60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
31d70 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
31d80 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
31d90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31da0 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50  Cur->ix<pCur->pP
31db0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
31dc0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
31dd0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
31de0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
31df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31e00 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
31e10 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
31e20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
31e30 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
31e40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
31e50 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
31e60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
31e70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
31e80 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
31e90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
31ea0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
31eb0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
31ec0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
31ed0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
31ee0 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
31ef0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
31f00 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
31f10 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
31f20 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
31f30 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
31f40 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
31f50 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
31f60 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
31f70 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  fl)==0 );.  retu
31f80 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
31f90 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
31fa0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
31fb0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
31fc0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
31fd0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
31fe0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
31ff0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
32000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
32010 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
32020 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
32030 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
32040 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
32050 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
32060 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
32070 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
32080 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
32090 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
320a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
320b0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
320c0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
320d0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
320e0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
320f0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
32100 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
32110 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
32120 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
32130 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
32140 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
32150 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
32160 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
32170 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
32180 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
32190 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
321a0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
321b0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
321c0 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69  * Return an esti
321d0 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d  mate for the num
321e0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
321f0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43  he table that pC
32200 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ur is.** pointin
32210 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20  g to.  Return a 
32220 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
32230 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69  if no estimate i
32240 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
32250 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36  available..*/.i6
32260 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  4 sqlite3BtreeRo
32270 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73  wCountEst(BtCurs
32280 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34  or *pCur){.  i64
32290 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61   n;.  u8 i;..  a
322a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
322b0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
322c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
322d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
322e0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
322f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
32300 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73  * Currently this
32310 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e   interface is on
32320 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ly called by the
32330 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20   OP_IfSmaller.  
32340 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69  ** opcode, and i
32350 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  t that case the 
32360 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61  cursor will alwa
32370 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a  ys be valid and.
32380 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73    ** will always
32390 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66   point to a leaf
323a0 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   node. */.  if( 
323b0 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61  NEVER(pCur->eSta
323c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
323d0 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
323e0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
323f0 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29  >pPage->leaf==0)
32400 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20   ) return -1;.. 
32410 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65   n = pCur->pPage
32420 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69  ->nCell;.  for(i
32430 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
32440 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a  e; i++){.    n *
32450 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
32460 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20  ]->nCell;.  }.  
32470 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
32480 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
32490 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
324a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
324b0 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74  atabase. .** Ret
324c0 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a  urn value:.**.**
324d0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
324e0 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20       success.** 
324f0 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
32500 20 20 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c      cursor is al
32510 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61  ready pointing a
32520 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  t the last eleme
32530 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69  nt.**    otherwi
32540 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b  se        some k
32550 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63  ind of error occ
32560 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20  urred.**.** The 
32570 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
32580 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
32590 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
325a0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
325b0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
325c0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
325d0 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
325e0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
325f0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
32600 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
32610 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
32620 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
32630 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
32640 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
32650 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
32660 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
32670 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
32680 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
32690 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
326a0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
326b0 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
326c0 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
326d0 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  t in sqlite3Btre
326e0 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c  eNext(C,F) is 1,
326f0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72   then the.** cur
32700 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  sor corresponds 
32710 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
32720 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
32730 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
32740 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74  .** skipped if t
32750 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  he SQL index had
32760 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69   been a unique i
32770 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67  ndex.  The F arg
32780 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69  ument.** is a hi
32790 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
327a0 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72  ent.  SQLite btr
327b0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
327c0 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  n does not use.*
327d0 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  * this hint, but
327e0 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
327f0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
32800 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
32810 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
32820 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
32830 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
32840 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
32850 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
32860 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
32870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
32880 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
32890 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
328a0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
328b0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
328c0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
328d0 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
328e0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
328f0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
32900 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  fl)==0 );.    rc
32910 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
32920 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
32930 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
32950 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
32960 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
32970 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
32980 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  tate ){.      re
32990 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
329a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
329b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
329c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
329d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
329e0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
329f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
32a00 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
32a10 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
32a20 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
32a30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
32a40 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
32a50 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
32a60 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
32a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32a80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
32a90 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
32aa0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
32ab0 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
32ac0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20  r->pPage;.  idx 
32ad0 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20  = ++pCur->ix;.  
32ae0 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
32af0 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  it ){.    /* The
32b00 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20   only known way 
32b10 66 6f 72 20 74 68 69 73 20 74 6f 20 68 61 70 70  for this to happ
32b20 65 6e 20 69 73 20 66 6f 72 20 74 68 65 72 65 20  en is for there 
32b30 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72  to be a.    ** r
32b40 65 63 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e  ecursive SQL fun
32b50 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20  ction that does 
32b60 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  a DELETE operati
32b70 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a  on as part of a.
32b80 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68      ** SELECT wh
32b90 69 63 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74  ich deletes cont
32ba0 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ent out from und
32bb0 65 72 20 61 6e 20 61 63 74 69 76 65 20 63 75 72  er an active cur
32bc0 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20  sor.    ** in a 
32bd0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
32be0 20 66 69 6c 65 20 77 68 65 72 65 20 74 68 65 20   file where the 
32bf0 74 61 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45  table being DELE
32c00 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  TE-ed from.    *
32c10 2a 20 68 61 73 20 70 61 67 65 73 20 69 6e 20 63  * has pages in c
32c20 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74  ommon with the t
32c30 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
32c40 65 64 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20  ed.  See TH3.   
32c50 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f   ** module cov1/
32c60 62 74 72 65 65 37 38 2e 74 65 73 74 20 74 65 73  btree78.test tes
32c70 74 63 61 73 65 20 32 32 30 20 28 32 30 31 38 2d  tcase 220 (2018-
32c80 30 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20  06-08) for an.  
32c90 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f    ** example. */
32ca0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
32cb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
32cc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
32cd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32ce0 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
32cf0 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
32d00 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
32d10 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
32d20 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
32d30 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
32d40 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
32d50 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
32d60 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
32d70 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
32d80 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
32d90 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
32da0 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
32db0 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
32dc0 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
32dd0 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
32de0 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
32df0 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
32e00 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
32e10 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
32e20 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
32e30 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
32e40 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
32e50 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
32e60 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
32e70 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
32e80 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
32e90 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
32ea0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
32eb0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
32ec0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32ed0 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
32ee0 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
32ef0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
32f00 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
32f10 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
32f20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
32f30 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
32f40 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
32f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32f60 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
32f70 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
32f80 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
32f90 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
32fa0 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
32fb0 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e  Cur->ix>=pPage->
32fc0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
32fd0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
32fe0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
32ff0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
33000 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65  pCur, 0);.    }e
33010 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
33020 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
33030 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
33040 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
33050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33060 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
33070 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
33080 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
33090 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
330a0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
330b0 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73  *pCur, int flags
330c0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
330d0 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  age;.  UNUSED_PA
330e0 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29  RAMETER( flags )
330f0 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f  ;  /* Used in CO
33100 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74  MDB2 but not nat
33110 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20  ive SQLite */.  
33120 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
33130 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
33140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
33150 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
33160 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
33170 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
33180 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
33190 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
331a0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
331b0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
331c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
331d0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
331e0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
331f0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
33200 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
33210 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
33220 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50  Next(pCur);.  pP
33230 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
33240 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  e;.  if( (++pCur
33250 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->ix)>=pPage->nC
33260 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
33270 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  >ix--;.    retur
33280 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
33290 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
332a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
332b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
332c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
332d0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
332e0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
332f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
33300 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
33310 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
33320 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
33330 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52  e database..** R
33340 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
33350 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
33360 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a  K     success.**
33370 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45       SQLITE_DONE
33380 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73     the cursor is
33390 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20   already on the 
333a0 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
333b0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
333c0 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
333d0 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
333e0 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
333f0 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
33400 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
33410 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
33420 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
33430 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
33440 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
33450 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
33460 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
33470 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
33480 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
33490 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
334a0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
334b0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
334c0 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
334d0 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
334e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
334f0 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
33500 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
33510 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
33520 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
33530 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
33540 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
33550 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
33560 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74  ent to sqlite3Bt
33570 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29  reePrevious(C,F)
33580 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74   is 1, then.** t
33590 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  he cursor corres
335a0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
335b0 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
335c0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
335d0 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
335e0 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
335f0 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
33600 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
33610 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61   F argument is a
33620 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20  .** hint to the 
33630 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20  implement.  The 
33640 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62 74  native SQLite bt
33650 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
33660 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75  on does not.** u
33670 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75  se this hint, bu
33680 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a  t COMDB2 does..*
33690 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
336a0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
336b0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
336c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
336d0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
336e0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
336f0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
33700 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
33710 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
33720 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
33730 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
33740 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
33750 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
33760 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74  Flags & (BTCF_At
33770 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
33780 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
33790 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ey))==0 );.  ass
337a0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
337b0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nSize==0 );.  if
337c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
337d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
337e0 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
337f0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
33800 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
33810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33820 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33830 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
33840 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
33850 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
33860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33870 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
33880 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
33890 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
338a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
338b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
338c0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
338d0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
338e0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
338f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
33900 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
33910 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
33920 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
33930 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
33940 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
33950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
33960 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
33970 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
33980 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
33990 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
339a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
339b0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
339c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
339d0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
339e0 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20  Cur->ix;.    rc 
339f0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
33a00 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
33a10 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
33a20 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
33a30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33a40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
33a50 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
33a60 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
33a70 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a   pCur->ix==0 ){.
33a80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
33a90 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
33aa0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
33ab0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
33ac0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
33ad0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
33ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
33af0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
33b00 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
33b10 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
33b20 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
33b30 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
33b40 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
33b50 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a  lidOvfl))==0 );.
33b60 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b  .    pCur->ix--;
33b70 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
33b80 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66  r->pPage;.    if
33b90 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
33ba0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
33bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
33bc0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
33bd0 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  us(pCur, 0);.   
33be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
33bf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33c00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
33c10 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
33c20 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
33c30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
33c40 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73  int flags){.  as
33c50 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
33c60 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
33c70 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
33c80 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
33c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
33ca0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
33cb0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
33cc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
33cd0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33ce0 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
33cf0 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
33d00 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
33d10 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72  SQLite */.  pCur
33d20 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
33d30 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
33d40 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
33d50 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
33d60 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
33d70 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
33d80 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
33d90 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
33da0 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  >ix==0.   || pCu
33db0 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  r->pPage->leaf==
33dc0 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
33dd0 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  n btreePrevious(
33de0 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pCur);.  }.  pCu
33df0 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72  r->ix--;.  retur
33e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
33e10 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
33e20 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
33e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
33e50 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
33e60 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
33e70 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
33e80 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
33e90 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
33ea0 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
33eb0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
33ec0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
33ed0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
33ee0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
33ef0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
33f00 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
33f10 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
33f20 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
33f30 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
33f40 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
33f50 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
33f60 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
33f70 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
33f80 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
33f90 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
33fa0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
33fb0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
33fc0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
33fd0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
33fe0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
33ff0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
34000 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
34010 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
34020 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
34030 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
34040 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
34050 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
34060 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
34070 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
34080 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
34090 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
340a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
340b0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
340c0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
340d0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
340e0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
340f0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
34100 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
34110 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
34120 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
34130 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
34140 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
34150 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
34160 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
34170 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
34180 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
34190 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
341a0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
341b0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
341c0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
341d0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
341e0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
341f0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
34200 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
34210 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
34220 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
34230 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
34240 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
34250 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
34260 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
34270 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
34280 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
34290 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
342a0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
342b0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
342c0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
342d0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
342e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
342f0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
34300 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
34310 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
34320 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
34330 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
34340 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
34350 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
34360 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
34370 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
34380 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
34390 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
343a0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
343b0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
343c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
343d0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
343e0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
343f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
34400 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
34410 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
34420 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
34430 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
34440 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
34450 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
34460 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
34470 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
34480 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
34490 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
344a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
344b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
344c0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
344d0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
344e0 65 61 72 62 79 3e 30 20 26 26 20 52 45 51 55 49  earby>0 && REQUI
344f0 52 45 5f 50 54 52 4d 41 50 20 29 20 29 3b 0a 20  RE_PTRMAP ) );. 
34500 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
34510 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
34520 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
34530 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44  (pBt);.  /* EVID
34540 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39  ENCE-OF: R-05119
34550 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74  -02637 The 4-byt
34560 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
34570 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
34580 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74  6.  ** stores st
34590 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ores the total n
345a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
345b0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
345c0 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  */.  n = get4byt
345d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
345e0 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
345f0 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
34600 3b 0a 20 20 69 66 28 20 49 53 43 4f 4e 43 55 52  ;.  if( ISCONCUR
34610 52 45 4e 54 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78  RENT==0 && n>=mx
34620 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
34630 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34640 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
34650 2a 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20  * Ensure page 1 
34660 69 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69  is writable. Thi
34670 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
34680 65 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68  either change th
34690 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
346a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72   pages in the fr
346b0 65 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73  ee-list or the s
346c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
346d0 61 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20  ase file. Since 
346e0 62 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65  both.  ** of the
346f0 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  se operations in
34700 76 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20  volve modifying 
34710 70 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69  page 1 header fi
34720 65 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a  elds, page 1.  *
34730 2a 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c  * will definitel
34740 79 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20  y be written by 
34750 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
34760 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
34770 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20  CONCURRENT.  ** 
34780 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73  transaction, ens
34790 75 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72  ure the BtreePtr
347a0 6d 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61  map structure ha
347b0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
347c0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
347d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
347e0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
347f0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
34800 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e  rn rc;..  if( n>
34810 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
34820 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
34830 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
34840 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
34850 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
34860 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
34870 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
34880 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
34890 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
348a0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
348b0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
348c0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
348d0 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
348e0 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
348f0 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
34900 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
34910 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
34920 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
34930 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
34940 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
34950 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
34960 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
34970 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
34980 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
34990 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
349a0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
349b0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
349c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f    */.    if( eMo
349d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
349e0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
349f0 74 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21  t( ISAUTOVACUUM!
34a00 3d 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b  =ISCONCURRENT );
34a10 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
34a20 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
34a30 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
34a40 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
34a50 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
34a60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
34a70 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
34a80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
34a90 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
34aa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
34ab0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
34ac0 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
34ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
34ae0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34af0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54            if( eT
34b00 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
34b10 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
34b20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
34b30 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
34b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
34b60 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
34b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
34b80 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
34b90 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
34ba0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
34bb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
34bc0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
34bd0 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
34be0 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
34bf0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
34c00 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
34c10 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
34c20 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
34c30 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
34c40 20 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79     */.    put4by
34c50 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
34c60 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
34c70 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
34c80 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
34c90 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
34ca0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
34cb0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
34cc0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
34cd0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
34ce0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
34cf0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
34d00 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
34d10 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
34d20 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
34d30 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
34d40 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
34d50 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
34d60 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
34d70 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
34d80 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
34d90 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
34da0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
34db0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
34dc0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
34dd0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
34de0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
34df0 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
34e00 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
34e10 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
34e20 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
34e30 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
34e40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
34e50 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
34e60 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
34e70 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
34e80 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
34e90 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
34ea0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
34eb0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
34ec0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
34ed0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
34ee0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
34ef0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
34f00 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
34f10 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
34f20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
34f30 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
34f40 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
34f50 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
34f60 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
34f70 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
34f80 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
34f90 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
34fa0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
34fb0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
34fc0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
34fd0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
34fe0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
34ff0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
35000 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
35010 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
35020 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
35030 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
35040 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35050 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
35060 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72  pPrevTrunk ? pPr
35070 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20  evTrunk->pgno : 
35080 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
35090 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
350a0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
350b0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
350c0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
350d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
350e0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
350f0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
35100 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
35110 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
35120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
35130 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
35140 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
35150 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
35160 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
35170 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
35180 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
35190 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
351a0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
351b0 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
351c0 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
351d0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
351e0 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
351f0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
35200 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
35210 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
35220 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
35230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
35240 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
35250 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
35260 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
35270 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
35280 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
35290 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
352a0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
352b0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
352c0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
352d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
352e0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
352f0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
35300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35310 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
35320 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
35330 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
35340 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
35350 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
35360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35370 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
35380 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
35390 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
353a0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
353b0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
353c0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
353d0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
353e0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
353f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
35400 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
35410 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
35420 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
35430 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
35440 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
35450 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
35460 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
35470 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
35480 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
35490 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
354a0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
354b0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
354c0 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
354d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
354e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
354f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35500 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35510 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
35520 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
35530 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
35540 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
35550 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
35560 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
35570 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
35580 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
35590 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
355a0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
355b0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
355c0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
355d0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
355e0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
355f0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
35600 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35610 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
35620 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
35630 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
35640 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
35650 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
35660 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35670 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
35680 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
35690 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
356a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
356b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
356c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
356d0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
356e0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
356f0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
35700 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
35710 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
35720 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
35730 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
35740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
35750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35760 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
35770 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
35780 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
35790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
357a0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
357b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
357c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
357d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
357e0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
357f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
35800 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
35810 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
35820 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
35830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35840 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
35850 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
35860 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
35870 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
35880 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
35890 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
358a0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
358b0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
358c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
358d0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
358e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
358f0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
35900 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
35910 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
35920 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
35930 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
35940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
35950 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
35960 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
35970 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
35980 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
35990 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
359a0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
359b0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
359c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
359d0 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
359e0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
359f0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
35a00 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
35a10 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
35a20 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
35a30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
35a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35a50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
35a60 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
35a70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35a80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35a90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35aa0 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
35ab0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
35ac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
35ae0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
35af0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
35b00 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
35b10 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
35b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35b30 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
35b40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
35b50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
35b60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
35b70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
35b80 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
35b90 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
35ba0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
35bb0 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
35bc0 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
35bd0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
35be0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35bf0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
35c00 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
35c10 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
35c20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
35c30 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35c40 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
35c50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
35c60 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
35c70 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
35c80 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
35c90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
35ca0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35cb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35cc0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
35cd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35ce0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
35cf0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
35d00 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
35d10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
35d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
35d30 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
35d40 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
35d50 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
35d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
35d70 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
35d80 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
35d90 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
35da0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
35db0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
35dc0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
35dd0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
35de0 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
35df0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
35e00 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
35e10 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
35e20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
35e30 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
35e40 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
35e50 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
35e60 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
35e70 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
35e80 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
35e90 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
35ea0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
35eb0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
35ec0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
35ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
35ee0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
35ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35f00 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
35f10 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
35f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
35f30 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
35f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35f50 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
35f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35f70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
35f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35f90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35fb0 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
35fc0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
35fd0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
35fe0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
35ff0 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
36000 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
36010 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
36020 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
36030 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
36040 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
36050 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
36060 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
36070 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
36080 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
36090 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
360a0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
360b0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
360c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
360d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
360e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
360f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
36100 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
36110 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
36120 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
36130 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
36140 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
36150 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
36160 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
36170 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
36180 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
36190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
361a0 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
361b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
361c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
361d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
361e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
361f0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
36200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
36210 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
36220 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
36230 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
36240 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
36250 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
36260 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
36270 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
36280 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
36290 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
362a0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
362b0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
362c0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
362d0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
362e0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
362f0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
36300 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
36310 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
36320 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
36330 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
36340 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
36350 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
36360 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
36370 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
36380 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
36390 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
363a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
363b0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
363c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
363d0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
363e0 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
363f0 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
36400 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
36410 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
36420 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
36430 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
36440 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
36450 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
36460 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
36470 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
36480 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
36490 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
364a0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
364b0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
364c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
364d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
364e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
364f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
36500 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
36510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
36520 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36540 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
36550 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
36560 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
36570 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
36580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36590 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
365a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
365b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
365c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
365d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
365e0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
365f0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
36600 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
36610 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
36620 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
36630 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
36640 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
36650 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
36660 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
36670 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
36680 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
36690 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
366a0 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
366b0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
366c0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
366d0 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
366e0 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
366f0 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
36700 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
36710 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
36720 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
36730 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
36740 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
36750 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
36760 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
36770 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
36780 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
36790 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
367a0 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
367b0 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
367c0 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
367d0 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
367e0 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
367f0 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
36800 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
36810 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
36820 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
36830 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
36840 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
36850 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
36860 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
36870 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
36880 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
36890 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
368a0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
368b0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
368c0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
368d0 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
368e0 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
368f0 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
36900 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
36910 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
36920 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
36930 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
36940 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36950 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
36960 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
36970 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
36980 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
36990 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
369a0 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
369b0 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
369c0 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
369d0 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
369e0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
369f0 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
36a00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
36a10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
36a20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
36a30 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
36a40 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
36a50 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
36a60 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
36a70 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
36a80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36a90 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
36aa0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
36ab0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
36ac0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
36ad0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
36ae0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
36af0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
36b00 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
36b10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36b20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
36b30 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
36b40 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
36b50 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
36b60 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
36b70 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
36b80 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
36b90 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
36ba0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
36bb0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
36bc0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
36bd0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
36be0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
36bf0 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
36c00 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
36c10 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
36c20 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
36c30 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
36c40 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
36c50 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
36c60 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
36c70 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
36c80 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
36c90 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
36ca0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
36cb0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
36cc0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
36cd0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
36ce0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
36cf0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
36d00 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
36d10 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
36d20 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
36d30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36d60 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
36d70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
36d80 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
36d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36da0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36db0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
36dc0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
36dd0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
36de0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36df0 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
36e00 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
36e10 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
36e20 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
36e30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
36e40 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
36e50 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
36e60 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
36e70 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
36e80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
36e90 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
36ea0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
36eb0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
36ec0 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
36ed0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
36ee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
36ef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36f00 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
36f10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
36f20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36f30 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
36f40 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
36f50 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
36f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
36f70 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
36f80 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
36f90 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
36fa0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
36fb0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
36fc0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
36fd0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
36fe0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
36ff0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
37000 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
37010 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
37020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
37030 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
37040 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
37050 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
37060 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
37070 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
37080 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
37090 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
370a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
370b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
370c0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
370d0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
370e0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
370f0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
37100 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
37110 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
37120 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
37130 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
37140 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
37150 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
37160 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
37170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37180 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
37190 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
371a0 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
371b0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
371c0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
371d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
371e0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
371f0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
37200 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
37210 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
37220 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
37230 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
37240 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
37250 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
37260 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
37270 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
37280 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
37290 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
372a0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
372b0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
372c0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
372d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
372e0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
372f0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
37300 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
37310 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
37320 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
37330 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
37340 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
37350 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
37360 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
37370 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
37380 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
37390 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
373a0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
373b0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
373c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
373d0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
373e0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
373f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37400 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
37410 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
37420 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
37430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37440 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
37450 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
37460 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
37470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37480 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
37490 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
374a0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
374b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
374c0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
374d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
374e0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
374f0 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
37500 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
37510 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
37520 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
37530 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75  ( iPage<2 ) retu
37540 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
37550 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d  T_BKPT;.  if( pM
37560 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
37570 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
37580 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37590 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
375a0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
375b0 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
375c0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
375d0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
375e0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
375f0 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
37600 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
37610 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37620 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
37630 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
37640 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
37650 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
37660 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
37670 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
37680 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
37690 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
376a0 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
376b0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
376c0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
376d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
376e0 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
376f0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
37700 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
37710 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
37720 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
37730 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
37740 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
37750 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
37760 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
37770 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
37780 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
37790 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
377a0 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
377b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
377c0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
377d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
377e0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
377f0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
37800 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
37810 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
37820 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
37830 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
37840 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
37850 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
37860 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
37870 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
37880 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
37890 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
378a0 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 52  ee..  */.  if( R
378b0 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20 29 7b  EQUIRE_PTRMAP ){
378c0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
378d0 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
378e0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
378f0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
37900 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
37910 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
37920 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
37930 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
37940 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
37950 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
37960 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
37970 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
37980 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
37990 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
379a0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
379b0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
379c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
379d0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
379e0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
379f0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
37a00 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
37a10 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
37a20 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
37a30 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
37a40 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
37a50 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
37a60 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
37a70 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
37a80 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
37a90 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
37aa0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
37ab0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
37ac0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
37ad0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
37ae0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
37af0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
37b00 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
37b10 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
37b20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
37b30 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
37b40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
37b50 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
37b60 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
37b70 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
37b80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
37ba0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
37bb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
37bc0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
37bd0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
37be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
37bf0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
37c00 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
37c10 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
37c20 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
37c30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
37c40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
37c50 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
37c60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
37c70 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
37c80 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
37c90 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
37ca0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
37cb0 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
37cc0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
37cd0 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
37ce0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
37cf0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
37d00 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
37d10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
37d20 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
37d30 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
37d40 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
37d50 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
37d60 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
37d70 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
37d80 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
37d90 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
37da0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
37db0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
37dc0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
37dd0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
37de0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
37df0 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
37e00 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
37e10 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
37e20 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
37e30 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
37e40 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
37e50 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
37e60 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
37e70 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
37e80 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
37e90 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
37ea0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
37eb0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
37ec0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
37ed0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
37ee0 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
37ef0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
37f00 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
37f10 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
37f20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
37f30 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
37f40 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
37f50 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
37f60 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
37f70 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
37f80 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
37f90 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
37fa0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
37fb0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
37fc0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
37fd0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
37fe0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
37ff0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
38000 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
38010 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f  R-19920-11576 Ho
38020 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72  wever, newer ver
38030 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
38040 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61  still.      ** a
38050 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c  void using the l
38060 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20  ast six entries 
38070 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  in the freelist 
38080 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79  trunk page array
38090 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
380a0 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65  er that database
380b0 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62   files created b
380c0 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
380d0 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62   of SQLite can b
380e0 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  e.      ** read 
380f0 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
38100 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20  s of SQLite..   
38110 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
38120 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
38130 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
38140 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
38150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
38160 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
38170 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
38180 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
38190 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
381a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
381b0 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
381c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
381d0 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
381e0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
381f0 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
38200 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
38210 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
38220 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
38230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38240 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
38250 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
38260 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
38270 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
38280 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
38290 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
382a0 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
382b0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
382c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
382d0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
382e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
382f0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
38300 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
38310 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
38320 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
38330 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
38340 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
38350 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
38360 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
38370 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
38380 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
38390 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
383a0 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
383b0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
383c0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
383d0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
383e0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
383f0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
38400 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
38410 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
38420 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
38430 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
38440 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
38450 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
38460 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
38470 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
38480 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
38490 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
384a0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
384b0 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
384c0 6c