/ Hex Artifact Content
Login

Artifact 82829cc64c872106b03213819308b4695bdafaf2aa7566e80ec4b218e2edac88:


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 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  }.}../*.** Check
5440: 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
5450: 72 2d 6d 61 70 20 64 6f 65 73 20 6e 6f 74 20 63  r-map does not c
5460: 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
5470: 65 73 20 77 69 74 68 20 61 20 70 61 72 65 6e 74  es with a parent
5480: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 30 2e 20 43  .** page of 0. C
5490: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  all sqlite3_log(
54a0: 29 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  ) multiple times
54b0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 65   to output the e
54c0: 6e 74 69 72 65 0a 2a 2a 20 64 61 74 61 20 73 74  ntire.** data st
54d0: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 64 6f  ructure if it do
54e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
54f0: 69 64 20 62 74 72 65 65 50 74 72 6d 61 70 43 68  id btreePtrmapCh
5500: 65 63 6b 28 42 74 53 68 61 72 65 64 20 2a 70 42  eck(BtShared *pB
5510: 74 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  t, Pgno nPage){.
5520: 20 20 50 67 6e 6f 20 69 3b 0a 20 20 69 6e 74 20    Pgno i;.  int 
5530: 62 50 72 6f 62 6c 65 6d 20 3d 20 30 3b 0a 20 20  bProblem = 0;.  
5540: 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 20 3d  BtreePtrmap *p =
5550: 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 0a 20 20 66   pBt->pMap;..  f
5560: 6f 72 28 69 3d 70 2d 3e 69 46 69 72 73 74 3b 20  or(i=p->iFirst; 
5570: 69 3c 3d 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  i<=nPage; i++){.
5580: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
5590: 2a 70 45 6e 74 72 79 20 3d 20 26 70 2d 3e 61 50  *pEntry = &p->aP
55a0: 74 72 5b 69 2d 70 2d 3e 69 46 69 72 73 74 5d 3b  tr[i-p->iFirst];
55b0: 0a 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d  .    if( pEntry-
55c0: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f  >eType==PTRMAP_O
55d0: 56 45 52 46 4c 4f 57 31 0a 20 20 20 20 20 7c 7c  VERFLOW1.     ||
55e0: 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
55f0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
5600: 0a 20 20 20 20 20 7c 7c 20 70 45 6e 74 72 79 2d  .     || pEntry-
5610: 3e 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42  >eType==PTRMAP_B
5620: 54 52 45 45 0a 20 20 20 20 29 7b 0a 20 20 20 20  TREE.    ){.    
5630: 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 70 61    if( pEntry->pa
5640: 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rent==0 ){.     
5650: 20 20 20 62 50 72 6f 62 6c 65 6d 20 3d 20 31 3b     bProblem = 1;
5660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5680: 7d 0a 0a 20 20 69 66 28 20 62 50 72 6f 62 6c 65  }..  if( bProble
5690: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  m ){.    for(i=p
56a0: 2d 3e 69 46 69 72 73 74 3b 20 69 3c 3d 6e 50 61  ->iFirst; i<=nPa
56b0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
56c0: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
56d0: 74 72 79 20 3d 20 26 70 2d 3e 61 50 74 72 5b 69  try = &p->aPtr[i
56e0: 2d 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20  -p->iFirst];.   
56f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
5700: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 0a  QLITE_CORRUPT, .
5710: 20 20 20 20 20 20 20 20 20 20 22 62 74 72 65 65            "btree
5720: 50 74 72 6d 61 70 43 68 65 63 6b 3a 20 70 67 6e  PtrmapCheck: pgn
5730: 6f 3d 25 64 20 65 54 79 70 65 3d 25 64 20 70 61  o=%d eType=%d pa
5740: 72 65 6e 74 3d 25 64 22 2c 20 0a 20 20 20 20 20  rent=%d", .     
5750: 20 20 20 20 20 28 69 6e 74 29 69 2c 20 28 69 6e       (int)i, (in
5760: 74 29 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c  t)pEntry->eType,
5770: 20 28 69 6e 74 29 70 45 6e 74 72 79 2d 3e 70 61   (int)pEntry->pa
5780: 72 65 6e 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  rent.      );.  
5790: 20 20 7d 0a 20 20 20 20 61 62 6f 72 74 28 29 3b    }.    abort();
57a0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 20 20 2f  .  }.}..#else  /
57b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
57c0: 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 23 20 64 65  NCURRENT */.# de
57d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
57e0: 41 6c 6c 6f 63 61 74 65 28 78 29 20 53 51 4c 49  Allocate(x) SQLI
57f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5800: 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65  treePtrmapDelete
5810: 28 78 29 20 0a 23 20 64 65 66 69 6e 65 20 62 74  (x) .# define bt
5820: 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 78  reePtrmapBegin(x
5830: 2c 79 29 20 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  ,y)  SQLITE_OK.#
5840: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5850: 6d 61 70 45 6e 64 28 78 2c 79 2c 7a 29 20 0a 23  mapEnd(x,y,z) .#
5860: 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74 72   define btreePtr
5870: 6d 61 70 43 68 65 63 6b 28 79 2c 7a 29 20 0a 23  mapCheck(y,z) .#
5880: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5890: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
58a0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
58b0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
58c0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
58d0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
58e0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
58f0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
5900: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
5910: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
5920: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5930: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5940: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
5950: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
5960: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5970: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
5980: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5990: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
59a0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
59b0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
59c0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
59d0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
59e0: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
59f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5a00: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
5a10: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
5a20: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
5a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5a40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
5a50: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
5a60: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
5a70: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
5a80: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
5a90: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
5aa0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
5ab0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
5ac0: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
5ad0: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
5ae0: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
5af0: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
5b00: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
5b10: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
5b20: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
5b30: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
5b40: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
5b50: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
5b60: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
5b70: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
5b80: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
5b90: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
5ba0: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
5bb0: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
5bc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5bd0: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
5be0: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
5bf0: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
5c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
5c10: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
5c20: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
5c30: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
5c40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5c50: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
5c60: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
5c70: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
5c80: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
5c90: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
5ca0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5cb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
5cc0: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
5cd0: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
5ce0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5cf0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5d00: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
5d10: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
5d40: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
5d50: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
5d60: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
5d70: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5d80: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
5d90: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
5da0: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
5db0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
5dc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
5dd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
5de0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
5df0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
5e00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5e10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
5e20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
5e30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
5e40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
5e50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5e60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5e70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5e80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5e90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
5ea0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
5eb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
5ec0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5ed0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
5ee0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
5ef0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
5f00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
5f10: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
5f20: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
5f30: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
5f40: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
5f50: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
5f60: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
5f70: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
5f80: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
5f90: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
5fa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
5fb0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
5fc0: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
5fd0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
5fe0: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
5ff0: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
6000: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
6010: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
6020: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
6030: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
6040: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
6050: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
6060: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
6070: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
6080: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
6090: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
60a0: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
60b0: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
60c0: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
60d0: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
60e0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
60f0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
6100: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
6110: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
6120: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
6130: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
6140: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
6150: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6160: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
6170: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
6180: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
6190: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
61a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
61b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
61c0: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
61d0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
61e0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6200: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
6210: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
6220: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
6230: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
6240: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
6250: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
6260: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
6270: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
6280: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
6290: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
62a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
62b0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
62c0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
62d0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
62e0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
62f0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
6300: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
6310: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
6320: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
6330: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
6340: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
6350: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
6360: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
6370: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
6380: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
6390: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
63a0: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
63c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
63d0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
63e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
63f0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
6400: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
6410: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
6420: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
6430: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
6440: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
6450: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6460: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
6470: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
6480: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
6490: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
64a0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
64b0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
64c0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
64d0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
64e0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
64f0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
6500: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
6510: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6520: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
6530: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
6540: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
6550: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
6560: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
6570: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
6580: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
6590: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
65a0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
65b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
65c0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
65d0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
65e0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
65f0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
6600: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6610: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
6620: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
6630: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
6640: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
6650: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
6660: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
6670: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
6680: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
6690: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
66a0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
66b0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
66c0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
66d0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
66e0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
66f0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
6700: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
6710: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
6720: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
6730: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
6740: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
6750: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
6760: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
6770: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
6780: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
6790: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
67a0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
67b0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
67c0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
67d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
67e0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
67f0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
6800: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
6810: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
6820: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
6830: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
6840: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
6850: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
6860: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
6870: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
6880: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
6890: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
68a0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
68b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
68c0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
68d0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
68e0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
68f0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
6900: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
6910: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
6920: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6930: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
6940: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
6950: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
6960: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
6970: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
6980: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
6990: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
69a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
69b0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
69c0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
69d0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
69e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
69f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6a00: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
6a10: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
6a20: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
6a30: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
6a40: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
6a50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
6a60: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
6a70: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
6a80: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
6a90: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6aa0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
6ab0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
6ac0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
6ad0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
6ae0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
6af0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
6b00: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
6b10: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
6b20: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
6b30: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
6b40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
6b50: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6b70: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
6b80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b90: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
6ba0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6bb0: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
6bc0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
6bd0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
6be0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
6bf0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
6c00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
6c10: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
6c20: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
6c30: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
6c40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
6c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
6c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
6c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
6ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
6cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
6cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
6ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
6d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
6d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
6d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
6d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
6d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
6d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
6d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
6d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
6d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
6da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
6db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
6dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
6dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
6de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
6df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
6e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
6e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
6e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
6e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
6e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
6e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
6e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
6e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
6e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
6ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
6eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
6ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
6ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
6ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
6f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
6f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
6f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
6f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
6f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
6f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
6f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
6f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
6f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
6f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
6fb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
6fc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
6fd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
6fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
6ff0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
7000: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
7010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
7020: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
7030: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7040: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
7050: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
7060: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
7070: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
7080: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
7090: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
70a0: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
70b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
70c0: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
70d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
70e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
70f0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
7100: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
7110: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
7120: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7130: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
7140: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
7150: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
7160: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
7170: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
7180: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
7190: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
71a0: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
71b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
71c0: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
71d0: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
71e0: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
71f0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
7200: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
7210: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
7220: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
7230: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
7240: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
7250: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
7260: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
7270: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
7280: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
7290: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
72a0: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
72b0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
72c0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
72d0: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
72e0: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
72f0: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
7300: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
7310: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
7320: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
7330: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
7340: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7350: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7360: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
7370: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
7380: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
7390: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
73a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
73b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
73c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
73d0: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
73e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
73f0: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
7400: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
7410: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
7420: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7430: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
7440: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
7450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
7460: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
7470: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
7480: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
7490: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
74a0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
74b0: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
74c0: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
74d0: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
74e0: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
74f0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
7500: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
7510: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
7520: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
7530: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
7540: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
7550: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
7560: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
7570: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
7580: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
7590: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
75a0: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
75b0: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
75c0: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
75d0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
75e0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
75f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7600: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
7610: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
7620: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
7630: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
7640: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
7650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7660: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
7670: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
7680: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
7690: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
76a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
76c0: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
76d0: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
76e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
76f0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
7700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7710: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
7720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7730: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
7740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
7750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
7760: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
7770: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
7780: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
7790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
77a0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
77b0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
77c0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
77d0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
77e0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
77f0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
7800: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
7810: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
7820: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
7830: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
7840: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
7850: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
7860: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
7870: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
7880: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
7890: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
78a0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
78b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
78c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
78d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78e0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
78f0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
7900: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
7910: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
7920: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
7930: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
7940: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7950: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7960: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
7970: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7980: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
7990: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
79a0: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
79b0: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
79c0: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
79d0: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
79e0: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
79f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7a00: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
7a10: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
7a20: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
7a30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
7a40: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
7a50: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
7a60: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
7a70: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
7a80: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
7a90: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
7aa0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
7ab0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
7ac0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7ad0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
7ae0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
7af0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
7b00: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
7b10: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
7b20: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
7b30: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
7b40: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
7b50: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
7b60: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
7b70: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
7b80: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
7b90: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
7ba0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
7bb0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
7bc0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
7bd0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
7be0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
7bf0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
7c00: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
7c10: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
7c20: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
7c30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7c40: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
7c50: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
7c60: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
7c70: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
7c80: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
7c90: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
7ca0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
7cb0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
7cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
7cd0: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
7ce0: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
7cf0: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
7d00: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
7d10: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
7d20: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
7d30: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
7d40: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
7d50: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
7d60: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
7d70: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
7d80: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
7d90: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
7da0: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
7db0: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7dc0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
7dd0: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
7de0: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
7df0: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
7e00: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
7e10: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
7e20: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
7e30: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
7e40: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
7e50: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
7e60: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
7e70: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
7e80: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
7e90: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
7ea0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
7eb0: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
7ec0: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
7ed0: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
7ee0: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
7ef0: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
7f00: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
7f10: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
7f20: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
7f30: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
7f40: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
7f50: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
7f60: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
7f70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
7f80: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
7f90: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
7fa0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
7fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7fc0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7fd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
7fe0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
7ff0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
8000: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
8010: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
8020: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
8030: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8040: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8050: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
8060: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
8070: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
8080: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
8090: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
80a0: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
80b0: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
80c0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
80d0: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
80e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
80f0: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
8100: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
8110: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
8120: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
8130: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
8140: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
8150: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
8160: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
8170: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
8180: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
8190: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
81a0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
81b0: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
81c0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
81d0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
81e0: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
81f0: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
8200: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
8210: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
8220: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
8230: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
8240: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
8250: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
8260: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
8270: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
8280: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
8290: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
82a0: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
82b0: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
82c0: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
82d0: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
82e0: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
82f0: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
8300: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
8310: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
8320: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
8330: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
8340: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
8350: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
8360: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
8370: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
8380: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
8390: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
83a0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
83b0: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
83c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
83d0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
83e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
83f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8400: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
8410: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
8420: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
8430: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
8440: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
8450: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
8460: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
8470: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
8480: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
84a0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
84b0: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
84c0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
84d0: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
84e0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
84f0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
8500: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
8510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8520: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
8530: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
8540: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
8550: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
8560: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
8570: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
8580: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
8590: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
85a0: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
85b0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
85c0: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
85d0: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
85e0: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
85f0: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
8600: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
8610: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
8620: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
8630: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
8640: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
8650: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
8660: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
8670: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
8680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
8690: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
86a0: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
86b0: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
86c0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
86e0: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
86f0: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
8700: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
8710: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
8720: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
8730: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
8740: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
8750: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
8760: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
8770: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8780: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
87b0: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
87c0: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
87d0: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
87e0: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
87f0: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
8800: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8810: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
8820: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
8830: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
8840: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
8860: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
8870: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
8880: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
8890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
88a0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
88b0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
88c0: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
88d0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
88e0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
88f0: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
8900: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
8910: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
8920: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
8930: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8940: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8950: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
8960: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
8970: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
8980: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
8990: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
89a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
89b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
89c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
89d0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
89e0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
89f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8a00: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
8a10: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
8a20: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8a30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
8a40: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
8a50: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
8a60: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
8a70: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
8a80: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
8a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
8aa0: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
8ab0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
8ac0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
8ad0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
8ae0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
8af0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8b00: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
8b10: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
8b20: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
8b30: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
8b40: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
8b50: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
8b60: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
8b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
8b80: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
8b90: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
8ba0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
8bb0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
8bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
8bd0: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
8be0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
8bf0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
8c00: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
8c10: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
8c20: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
8c30: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
8c40: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
8c50: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
8c60: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
8c70: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
8c80: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
8c90: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
8ca0: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
8cb0: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
8cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8ce0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
8cf0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
8d00: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
8d10: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
8d20: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
8d30: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8d40: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
8d50: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
8d60: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
8d70: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
8d80: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
8d90: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
8da0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
8db0: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
8dc0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
8dd0: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
8de0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8df0: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
8e00: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
8e10: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
8e20: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8e30: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
8e40: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
8e50: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
8e60: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
8e70: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
8e80: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
8e90: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
8ea0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
8eb0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
8ec0: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
8ed0: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
8ee0: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
8ef0: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
8f00: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
8f10: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
8f20: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
8f30: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
8f40: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
8f50: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
8f60: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
8f70: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
8f80: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
8f90: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
8fa0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
8fb0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8fc0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
8fd0: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
8fe0: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
8ff0: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
9000: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
9010: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
9020: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
9030: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
9040: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
9050: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
9060: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
9070: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
9080: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
9090: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
90a0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
90b0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
90c0: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
90d0: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
90e0: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
90f0: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
9100: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9110: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
9120: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
9130: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
9140: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
9150: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
9160: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
9170: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
9180: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
9190: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
91a0: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
91b0: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
91c0: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
91d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
91e0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
91f0: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
9200: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
9210: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
9220: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
9230: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
9240: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
9250: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
9260: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
9270: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
9280: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
9290: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
92a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
92b0: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
92c0: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
92d0: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
92e0: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
92f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9300: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
9310: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
9320: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
9330: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
9340: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
9350: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
9360: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
9370: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
9380: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
9390: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
93a0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
93b0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
93c0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
93d0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
93e0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
93f0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
9400: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
9410: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
9420: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
9430: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
9440: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
9450: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
9460: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
9470: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
9480: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
9490: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
94a0: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
94b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
94c0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
94d0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
94e0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
94f0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
9500: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
9510: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
9520: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
9530: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
9540: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
9550: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
9560: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
9570: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
9580: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
9590: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
95a0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
95b0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
95c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
95d0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
95e0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
95f0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
9600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
9610: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
9620: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
9630: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
9640: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
9650: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
9660: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
9670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9680: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
9690: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
96a0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
96b0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
96c0: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
96d0: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
96e0: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
96f0: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
9700: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
9710: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
9720: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9730: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
9740: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
9750: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
9760: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
9770: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
9780: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
9790: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
97a0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
97b0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
97c0: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
97d0: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
97e0: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
97f0: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
9800: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
9810: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
9820: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
9830: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
9840: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9850: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
9860: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
9870: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
9880: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
9890: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
98a0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
98b0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
98c0: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
98d0: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
98e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
98f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
9900: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
9910: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
9920: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
9930: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
9940: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
9950: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
9960: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
9970: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
9980: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
9990: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
99a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
99b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
99c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
99d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
99e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
99f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
9a00: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
9a10: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
9a20: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
9a30: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
9a40: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
9a50: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
9a60: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
9a70: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
9a80: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
9a90: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
9aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
9ac0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
9ad0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
9ae0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
9af0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
9b00: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
9b10: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
9b20: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
9b30: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
9b40: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
9b50: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
9b60: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
9b70: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9b80: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
9b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
9ba0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
9bb0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
9bc0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
9bd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9be0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
9bf0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
9c00: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
9c10: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
9c20: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
9c30: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
9c40: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
9c50: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
9c60: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
9c70: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
9c80: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
9c90: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
9ca0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
9cb0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9cc0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
9cd0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
9ce0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
9cf0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
9d00: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
9d10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
9d20: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
9d30: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
9d40: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
9d50: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
9d60: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
9d70: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
9d80: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
9d90: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9da0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
9db0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
9dc0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
9dd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
9de0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
9df0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
9e00: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
9e10: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
9e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9e30: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
9e40: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
9e50: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
9e60: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
9e70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9e80: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
9e90: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
9ea0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
9eb0: 62 65 72 20 69 73 20 6e 65 76 65 72 20 61 64 64  ber is never add
9ec0: 65 64 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  ed to a pointer-
9ed0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
9ee0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
9ef0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
9f00: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
9f10: 74 29 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  t)) );..#ifndef 
9f20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
9f30: 55 52 52 45 4e 54 0a 20 20 69 66 28 20 70 42 74  URRENT.  if( pBt
9f40: 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70  ->pMap ){.    *p
9f50: 52 43 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  RC = btreePtrmap
9f60: 53 74 6f 72 65 28 70 42 74 2c 20 6b 65 79 2c 20  Store(pBt, key, 
9f70: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a  eType, parent);.
9f80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9f90: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
9fa0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
9fb0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
9fc0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
9fd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9fe0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
9ff0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
a000: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
a010: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
a020: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
a030: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
a040: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
a050: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
a060: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a070: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
a080: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
a090: 20 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33   ((char*)sqlite3
a0a0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
a0b0: 62 50 61 67 65 29 29 5b 30 5d 21 3d 30 20 29 7b  bPage))[0]!=0 ){
a0c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
a0d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 65 78  t byte of the ex
a0e0: 74 72 61 20 64 61 74 61 20 69 73 20 74 68 65 20  tra data is the 
a0f0: 4d 65 6d 50 61 67 65 2e 69 73 49 6e 69 74 20 62  MemPage.isInit b
a100: 79 74 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  yte..    ** If t
a110: 68 61 74 20 62 79 74 65 20 69 73 20 73 65 74 2c  hat byte is set,
a120: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 70   it means this p
a130: 61 67 65 20 69 73 20 61 6c 73 6f 20 62 65 69 6e  age is also bein
a140: 67 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  g used.    ** as
a150: 20 61 20 62 74 72 65 65 20 70 61 67 65 2e 20 2a   a btree page. *
a160: 2f 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  /.    *pRC = SQL
a170: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a180: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
a190: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 6f 66  p_exit;.  }.  of
a1a0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
a1b0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
a1c0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
a1d0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
a1e0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
a1f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
a200: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
a210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
a220: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
a230: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
a240: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
a250: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
a260: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
a270: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
a280: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
a290: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
a2a0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
a2b0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
a2c0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
a2d0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
a2e0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
a2f0: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
a300: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
a310: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
a320: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
a330: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a340: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
a350: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
a360: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
a370: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
a380: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
a390: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
a3a0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
a3b0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
a3c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
a3d0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
a3e0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
a3f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a400: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
a410: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
a420: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
a430: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
a440: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
a450: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
a460: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
a470: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
a480: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
a490: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
a4a0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
a4b0: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
a4c0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
a4d0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
a4e0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
a4f0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
a500: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
a510: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
a520: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
a530: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
a540: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
a550: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
a560: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
a570: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
a580: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
a590: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
a5a0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
a5b0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
a5c0: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
a5d0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
a5e0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
a5f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a600: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
a610: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
a620: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
a630: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
a640: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a650: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
a660: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
a670: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
a680: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
a690: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
a6a0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
a6b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
a6c0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
a6d0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
a6e0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
a6f0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
a700: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
a710: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
a720: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
a730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a740: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a750: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
a760: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
a770: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
a780: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
a790: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
a7a0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
a7b0: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
a7c0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
a7d0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
a7e0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
a7f0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
a800: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
a810: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
a820: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
a830: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50  _CORRUPT_PGNO(iP
a840: 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  trmap);.  return
a850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
a860: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
a870: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
a880: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
a890: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
a8a0: 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23  (w,x,y,z,rc).  #
a8b0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
a8c0: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
a8d0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
a8e0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
a8f0: 2c 20 79 2c 20 7a 2c 20 72 63 29 0a 23 65 6e 64  , y, z, rc).#end
a900: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
a910: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
a920: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
a930: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
a940: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
a950: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
a960: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
a970: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
a980: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
a990: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
a9a0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
a9b0: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
a9c0: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
a9d0: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
a9e0: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
a9f0: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
aa00: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
aa10: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
aa20: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
aa30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
aa40: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
aa50: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
aa60: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
aa70: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
aa80: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
aa90: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
aaa0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
aab0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
aac0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
aad0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
aae0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
aaf0: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
ab00: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
ab10: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
ab20: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
ab30: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
ab40: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
ab50: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
ab60: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
ab70: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
ab80: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
ab90: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
aba0: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
abb0: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
abc0: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
abd0: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
abe0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
abf0: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
ac00: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
ac10: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
ac20: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
ac30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
ac40: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
ac50: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
ac60: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
ac70: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
ac80: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
ac90: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
aca0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
acb0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
acc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
acd0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
ace0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
acf0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
ad00: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
ad10: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
ad20: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
ad30: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
ad40: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
ad50: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
ad60: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
ad70: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
ad80: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
ad90: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
ada0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
adb0: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
adc0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
add0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
ade0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
adf0: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
ae00: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
ae10: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
ae20: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
ae30: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
ae40: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
ae50: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
ae60: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
ae70: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
ae80: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
ae90: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
aea0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
aeb0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
aec0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
aed0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
aee0: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
aef0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
af00: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
af10: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
af20: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
af30: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
af40: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
af50: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
af60: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
af70: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
af80: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
af90: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
afa0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
afb0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
afc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
afd0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
afe0: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
aff0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
b000: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
b010: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
b020: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b030: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
b040: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
b050: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
b060: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
b070: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
b080: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
b090: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
b0a0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
b0b0: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
b0c0: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
b0d0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
b0e0: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
b0f0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
b100: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
b110: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
b120: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
b130: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b140: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
b150: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
b160: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
b170: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
b180: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
b190: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
b1a0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
b1b0: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
b1c0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
b1d0: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
b1e0: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
b1f0: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
b200: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
b210: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
b220: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
b230: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
b240: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
b250: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
b260: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
b270: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
b280: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
b290: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
b2a0: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
b2b0: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
b2c0: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
b2d0: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
b2e0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
b2f0: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
b300: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
b310: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
b320: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
b330: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
b340: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
b350: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
b360: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
b370: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
b380: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
b390: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
b3a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
b3b0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
b3c0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
b3d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
b3e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
b3f0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
b400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b410: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b420: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b430: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
b440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b450: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b460: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
b470: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
b480: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b490: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
b4a0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
b4b0: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
b4c0: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
b4d0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
b4e0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
b4f0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
b500: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
b510: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
b520: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
b530: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
b540: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
b550: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
b560: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
b570: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
b580: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b5a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
b5b0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
b5c0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b5d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b5e0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b5f0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
b600: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
b610: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
b620: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
b630: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
b640: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
b650: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b660: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
b670: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b690: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
b6a0: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
b6b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b6c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b6d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b6e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
b6f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
b700: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
b710: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
b720: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
b730: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
b740: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
b750: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
b760: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
b770: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
b780: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
b790: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
b7a0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
b7b0: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
b7c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
b7d0: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
b7e0: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
b7f0: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
b800: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
b810: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
b820: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
b830: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
b840: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
b850: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
b860: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
b870: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
b880: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
b890: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
b8a0: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
b8b0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
b8c0: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
b8d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
b8e0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
b8f0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
b900: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
b910: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
b920: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
b930: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
b940: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
b950: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
b960: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
b970: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
b980: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
b990: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
b9a0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
b9b0: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
b9c0: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
b9d0: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
b9e0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
b9f0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ba00: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
ba10: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
ba30: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
ba40: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
ba50: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
ba60: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
ba70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ba80: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
ba90: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
baa0: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
bab0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
bac0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
bad0: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
bae0: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
baf0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
bb00: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
bb10: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
bb20: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
bb30: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
bb40: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
bb50: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
bb60: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
bb70: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
bb80: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
bb90: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
bba0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
bbb0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
bbc0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
bbd0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
bbe0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
bbf0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
bc00: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
bc10: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
bc20: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
bc30: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
bc40: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
bc50: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
bc60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
bc70: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
bc80: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
bc90: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
bca0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
bcb0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
bcc0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
bcd0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
bce0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
bcf0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
bd00: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
bd10: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
bd20: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
bd30: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
bd40: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
bd50: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
bd60: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
bd70: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
bd80: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
bd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
bda0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
bdb0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
bdc0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
bdd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bde0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
bdf0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
be00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
be10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
be20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
be30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
be40: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
be50: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
be60: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
be70: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
be80: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
be90: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
bea0: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
beb0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
bec0: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
bed0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
bee0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
bef0: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
bf00: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
bf10: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
bf20: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
bf30: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
bf40: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
bf50: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
bf60: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
bf70: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
bf80: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
bf90: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
bfa0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
bfb0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
bfc0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
bfd0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
bfe0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
bff0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
c000: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
c010: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
c020: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
c030: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c040: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
c050: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
c060: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
c070: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
c080: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
c090: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
c0a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
c0b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
c0c0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
c0d0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
c0e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
c0f0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
c100: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
c110: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
c120: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
c130: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
c140: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
c150: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
c160: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
c170: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
c180: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
c190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
c1a0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
c1b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
c1c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
c1d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
c1e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
c1f0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
c200: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
c210: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
c220: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
c230: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
c240: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
c250: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
c260: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
c270: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
c280: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
c290: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
c2a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
c2b0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
c2c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
c2d0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
c2e0: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
c2f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
c300: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
c310: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
c320: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
c330: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
c340: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
c350: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
c360: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
c370: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
c380: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
c390: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
c3a0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
c3b0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
c3c0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
c3d0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
c3e0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
c3f0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
c400: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
c410: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
c420: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
c430: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
c440: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
c450: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
c460: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
c470: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
c480: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
c490: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
c4a0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
c4b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
c4c0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
c4d0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
c4e0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
c4f0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
c520: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
c530: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
c540: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
c570: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
c580: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c590: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
c5a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c5b0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
c5c0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
c5d0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
c5e0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
c5f0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
c600: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
c610: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
c620: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
c630: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
c640: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
c650: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
c660: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c670: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
c680: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
c690: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
c6a0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
c6b0: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
c6c0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
c6d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
c6e0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
c6f0: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
c700: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
c710: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
c720: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
c730: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
c740: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
c750: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
c760: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
c770: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
c780: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
c790: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
c7a0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
c7b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
c7c0: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
c7d0: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
c7e0: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
c7f0: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
c800: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
c810: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
c820: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
c830: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
c840: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
c850: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
c860: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
c870: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
c880: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
c890: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
c8a0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
c8b0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
c8c0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
c8d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
c8e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
c8f0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
c900: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
c910: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
c920: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
c930: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
c940: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
c950: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
c960: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
c970: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
c980: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
c990: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
c9a0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
c9b0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
c9c0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
c9d0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
c9e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
c9f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ca00: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
ca10: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
ca20: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
ca30: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
ca40: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
ca50: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
ca60: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
ca70: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
ca80: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
ca90: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
caa0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
cab0: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
cac0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
cad0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
cae0: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
caf0: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
cb00: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
cb10: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
cb20: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
cb30: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
cb40: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
cb50: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
cb60: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
cb70: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
cb80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
cb90: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
cba0: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
cbb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
cbc0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
cbd0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
cbe0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
cbf0: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
cc00: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
cc10: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
cc20: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
cc30: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
cc40: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
cc50: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
cc60: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
cc70: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
cc80: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
cc90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
cca0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
ccb0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
ccc0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
ccd0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
cce0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
ccf0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
cd00: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
cd10: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
cd20: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
cd30: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
cd40: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
cd50: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
cd60: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
cd70: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
cd80: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
cd90: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
cda0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
cdb0: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
cdc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
cdd0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
cde0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
cdf0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
ce00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ce10: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
ce20: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
ce30: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
ce40: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
ce50: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
ce60: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
ce70: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
ce80: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ce90: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
cea0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
ceb0: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
cec0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
ced0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
cee0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cef0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
cf00: 2a 2a 20 54 68 65 20 63 65 6c 6c 20 70 43 65 6c  ** The cell pCel
cf10: 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  l is currently p
cf20: 61 72 74 20 6f 66 20 70 61 67 65 20 70 53 72 63  art of page pSrc
cf30: 20 62 75 74 20 77 69 6c 6c 20 75 6c 74 69 6d 61   but will ultima
cf40: 74 65 6c 79 20 62 65 20 70 61 72 74 0a 2a 2a 20  tely be part.** 
cf50: 6f 66 20 70 50 61 67 65 2e 20 20 28 70 53 72 63  of pPage.  (pSrc
cf60: 20 61 6e 64 20 70 50 61 67 65 72 20 61 72 65 20   and pPager are 
cf70: 6f 66 74 65 6e 20 74 68 65 20 73 61 6d 65 2e 29  often the same.)
cf80: 20 20 49 66 20 70 43 65 6c 6c 20 63 6f 6e 74 61    If pCell conta
cf90: 69 6e 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  ins a.** pointer
cfa0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
cfb0: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
cfc0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
cfd0: 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 0a 2a  ointer-map for.*
cfe0: 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  * the overflow p
cff0: 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
d000: 20 76 61 6c 69 64 20 61 66 74 65 72 20 70 43 65   valid after pCe
d010: 6c 6c 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ll has been move
d020: 64 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2f 0a 73  d to pPage..*/.s
d030: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
d040: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
d050: 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50  age *pPage, MemP
d060: 61 67 65 20 2a 70 53 72 63 2c 20 75 38 20 2a 70  age *pSrc, u8 *p
d070: 43 65 6c 6c 2c 69 6e 74 20 2a 70 52 43 29 7b 0a  Cell,int *pRC){.
d080: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
d090: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
d0a0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
d0b0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
d0c0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
d0d0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
d0e0: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
d0f0: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
d100: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
d110: 6f 20 6f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20  o ovfl;.    if( 
d120: 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 53  SQLITE_WITHIN(pS
d130: 72 63 2d 3e 61 44 61 74 61 45 6e 64 2c 20 70 43  rc->aDataEnd, pC
d140: 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e  ell, pCell+info.
d150: 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 20  nLocal) ){.     
d160: 20 74 65 73 74 63 61 73 65 28 20 70 53 72 63 21   testcase( pSrc!
d170: 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =pPage );.      
d180: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
d190: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d1a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
d1b0: 20 20 20 20 6f 76 66 6c 20 3d 20 67 65 74 34 62      ovfl = get4b
d1c0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
d1d0: 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70  nSize-4]);.    p
d1e0: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
d1f0: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
d200: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
d210: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
d220: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
d230: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
d240: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
d250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f  This routine reo
d260: 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77  rganizes cells w
d270: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ithin the.** pag
d280: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
d290: 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63  are no free-bloc
d2a0: 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62  ks on the free-b
d2b0: 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  lock list..**.**
d2c0: 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46   Parameter nMaxF
d2d0: 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d  rag is the maxim
d2e0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61  um amount of fra
d2f0: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68  gmented space th
d300: 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65  at may be.** pre
d310: 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65  sent in the page
d320: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
d330: 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ine returns..**.
d340: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
d350: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
d360: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
d370: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
d380: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
d390: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
d3a0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
d3b0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
d3c0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
d3d0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
d3e0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
d3f0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
d400: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
d410: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
d420: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
d430: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d440: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
d450: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
d460: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
d470: 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72  Page, int nMaxFr
d480: 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ag){.  int i;   
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d4b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d4e0: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
d4f0: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d510: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
d520: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
d530: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
d540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
d550: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
d560: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
d570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d580: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
d590: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
d5a0: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
d5b0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
d5c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
d5d0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
d5e0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
d5f0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
d600: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
d610: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
d620: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
d630: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
d640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d650: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
d660: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
d670: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
d680: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
d690: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
d6a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
d6b0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
d6c0: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
d6d0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
d6e0: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
d6f0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
d700: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
d710: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
d720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
d730: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d740: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
d750: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
d770: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
d780: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
d790: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d7a0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d7b0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d7c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d7d0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d7e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
d7f0: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
d800: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
d810: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
d820: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
d830: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d840: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d850: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d860: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
d870: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
d880: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
d890: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
d8a0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
d8b0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
d8c0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
d8d0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
d8e0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
d8f0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
d900: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 7c 7c  &data[hdr+3]) ||
d910: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
d920: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
d930: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
d940: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
d950: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
d960: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
d970: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
d980: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
d990: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
d9a0: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
d9b0: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
d9c0: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
d9d0: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
d9e0: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
d9f0: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
da00: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
da10: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
da20: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
da30: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
da40: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
da50: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
da60: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
da70: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
da80: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
da90: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
daa0: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
dab0: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
dac0: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
dad0: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
dae0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
daf0: 5b 68 64 72 2b 31 5d 29 3b 0a 0a 20 20 20 20 2f  [hdr+1]);..    /
db00: 2a 20 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c  * If the initial
db10: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
db20: 74 20 77 65 72 65 20 6f 75 74 20 6f 66 20 62 6f  t were out of bo
db30: 75 6e 64 73 2c 20 74 68 61 74 20 77 6f 75 6c 64  unds, that would
db40: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 62 65 65   have.    ** bee
db50: 6e 20 64 65 74 65 63 74 65 64 20 62 79 20 62 74  n detected by bt
db60: 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70  reeComputeFreeSp
db70: 61 63 65 28 29 20 77 68 65 6e 20 69 74 20 77 61  ace() when it wa
db80: 73 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 0a  s computing the.
db90: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
dba0: 20 66 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74   free bytes on t
dbb0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
dbc0: 61 73 73 65 72 74 28 20 69 46 72 65 65 3c 3d 75  assert( iFree<=u
dbd0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
dbe0: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
dbf0: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
dc00: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
dc10: 61 5b 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20  a[iFree]);.     
dc20: 20 69 66 28 20 69 46 72 65 65 32 3e 75 73 61 62   if( iFree2>usab
dc30: 6c 65 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72  leSize-4 ) retur
dc40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dc50: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
dc60: 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65      if( 0==iFree
dc70: 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65  2 || (data[iFree
dc80: 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46  2]==0 && data[iF
dc90: 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20  ree2+1]==0) ){. 
dca0: 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20         u8 *pEnd 
dcb0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
dcc0: 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
dcd0: 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72         u8 *pAddr
dce0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
dcf0: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
dd00: 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
dd10: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
dd20: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
dd30: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
dd40: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
dd50: 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72      if( top>=iFr
dd60: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
dd70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dd80: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
dd90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dda0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
ddb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ddc0: 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32   iFree+sz>iFree2
ddd0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dde0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ddf0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
de00: 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  sz2 = get2byte(&
de10: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b  data[iFree2+2]);
de20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
de30: 46 72 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62  Free2+sz2 > usab
de40: 6c 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20  leSize ) return 
de50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
de60: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
de70: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
de80: 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32  ata[iFree+sz+sz2
de90: 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73  ], &data[iFree+s
dea0: 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65  z], iFree2-(iFre
deb0: 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20  e+sz));.        
dec0: 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20    sz += sz2;.   
ded0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
dee0: 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20  brk = top+sz;.  
def0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 62        assert( cb
df00: 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c  rk+(iFree-top) <
df10: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
df20: 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28          memmove(
df30: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61  &data[cbrk], &da
df40: 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74  ta[top], iFree-t
df50: 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  op);.        for
df60: 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c  (pAddr=&data[cel
df70: 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c  lOffset]; pAddr<
df80: 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b  pEnd; pAddr+=2){
df90: 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
dfa0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
dfb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
dfc0: 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32 62  c<iFree ){ put2b
dfd0: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
dfe0: 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65  ); }.          e
dff0: 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65 65  lse if( pc<iFree
e000: 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41  2 ){ put2byte(pA
e010: 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a  ddr, pc+sz2); }.
e020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e030: 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e    goto defragmen
e040: 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  t_out;.      }. 
e050: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b     }.  }..  cbrk
e060: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
e070: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
e080: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
e090: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
e0a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
e0b0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
e0c0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
e0d0: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
e0e0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
e0f0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
e100: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
e110: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
e120: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
e130: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
e140: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
e150: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65   );.    /* These
e160: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
e170: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
e180: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
e190: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
e1a0: 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f   if PRAGMA cell_
e1b0: 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20  size_check=ON.. 
e1c0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63     */.    if( pc
e1d0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
e1e0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
e1f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e200: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e210: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e220: 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43    assert( pc>=iC
e230: 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d  ellFirst && pc<=
e240: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
e250: 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78   size = pPage->x
e260: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
e270: 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63  &src[pc]);.    c
e280: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
e290: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
e2a0: 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  irst || pc+size>
e2b0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e2c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e2d0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
e2e0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
e2f0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
e300: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
e310: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
e320: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
e330: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
e340: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
e350: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
e360: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
e370: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
e380: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
e390: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
e3a0: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
e3b0: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
e3c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e3d0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
e3e0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
e3f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
e400: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
e410: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e420: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
e430: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
e440: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
e450: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
e460: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
e470: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
e480: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
e490: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
e4a0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
e4b0: 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75  .. defragment_ou
e4c0: 74 3a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t:.  assert( pPa
e4d0: 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a  ge->nFree>=0 );.
e4e0: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37    if( data[hdr+7
e4f0: 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ]+cbrk-iCellFirs
e500: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
e510: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e520: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
e530: 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
e540: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
e550: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
e560: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
e570: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
e580: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
e590: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
e5a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e5b0: 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c  [iCellFirst], 0,
e5c0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
e5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e5e0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
e5f0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
e600: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
e610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e620: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
e630: 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67  free-list on pag
e640: 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65 20  e pPg for space 
e650: 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20  to store a cell 
e660: 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a  nByte bytes in.*
e670: 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63  * size. If one c
e680: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  an be found, ret
e690: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
e6a0: 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20 72   the space and r
e6b0: 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d  emove it.** from
e6c0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
e6d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  **.** If no suit
e6e0: 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62  able space can b
e6f0: 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66  e found on the f
e700: 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e  ree-list, return
e710: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
e720: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64  s function may d
e730: 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e  etect corruption
e740: 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66   within pPg.  If
e750: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a   corruption is.*
e760: 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e 20  * detected then 
e770: 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53  *pRc is set to S
e780: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e  QLITE_CORRUPT an
e790: 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  d NULL is return
e7a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20  ed..**.** Slots 
e7b0: 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  on the free list
e7c0: 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65 65   that are betwee
e7d0: 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73 20  n 1 and 3 bytes 
e7e0: 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74  larger than nByt
e7f0: 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e  e.** will be ign
e800: 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20 74  ored if adding t
e810: 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20 74  he extra space t
e820: 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  o the fragmentat
e830: 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75  ion count.** cau
e840: 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74  ses the fragment
e850: 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65  ation count to e
e860: 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61  xceed 60..*/.sta
e870: 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64  tic u8 *pageFind
e880: 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  Slot(MemPage *pP
e890: 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  g, int nByte, in
e8a0: 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74  t *pRc){.  const
e8b0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
e8c0: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
e8d0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
e8e0: 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  to page header *
e8f0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  /.  u8 * const a
e900: 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
e910: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
e920: 2a 20 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  * Page data */. 
e930: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72   int iAddr = hdr
e940: 20 2b 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   + 1;           
e950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e960: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
e970: 20 70 63 20 2a 2f 0a 20 20 69 6e 74 20 70 63 20   pc */.  int pc 
e980: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
e990: 61 5b 69 41 64 64 72 5d 29 3b 20 20 20 20 20 20  a[iAddr]);      
e9a0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e9b0: 66 20 61 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  f a free slot */
e9c0: 0a 20 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20  .  int x;       
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 45 78 63 65 73 73 20 73 69 7a 65 20 6f 66 20   Excess size of 
ea00: 74 68 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e  the slot */.  in
ea10: 74 20 6d 61 78 50 43 20 3d 20 70 50 67 2d 3e 70  t maxPC = pPg->p
ea20: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
ea30: 20 6e 42 79 74 65 3b 20 20 2f 2a 20 4d 61 78 20   nByte;  /* Max 
ea40: 61 64 64 72 65 73 73 20 66 6f 72 20 61 20 75 73  address for a us
ea50: 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69  able slot */.  i
ea60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ea90: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
eaa0: 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ot */..  assert(
eab0: 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65   pc>0 );.  while
eac0: 28 20 70 63 3c 3d 6d 61 78 50 43 20 29 7b 0a 20  ( pc<=maxPC ){. 
ead0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
eae0: 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38  F: R-22710-53328
eaf0: 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66   The third and f
eb00: 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65  ourth bytes of e
eb10: 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62  ach.    ** freeb
eb20: 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d  lock form a big-
eb30: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
eb40: 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65  hich is the size
eb50: 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63   of the freebloc
eb60: 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65  k.    ** in byte
eb70: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  s, including the
eb80: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20   4-byte header. 
eb90: 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  */.    size = ge
eba0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
ebb0: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78  +2]);.    if( (x
ebc0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29   = size - nByte)
ebd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
ebe0: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
ebf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
ec00: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
ec10: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
ec20: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ec30: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
ec40: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
ec50: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
ec60: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
ec70: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
ec80: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
ec90: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
eca0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
ecb0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
ecc0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
ecd0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
ece0: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
ecf0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
ed00: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
ed10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
ed20: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
ed30: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
ed40: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
ed50: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
ed60: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
ed70: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
ed80: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
ed90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 2b      }else if( x+
eda0: 70 63 20 3e 20 6d 61 78 50 43 20 29 7b 0a 20 20  pc > maxPC ){.  
edb0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 6c        /* This sl
edc0: 6f 74 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74  ot extends off t
edd0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 75 73  he end of the us
ede0: 61 62 6c 65 20 70 61 72 74 20 6f 66 20 74 68 65  able part of the
edf0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
ee00: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
ee10: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29  ORRUPT_PAGE(pPg)
ee20: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ee30: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
ee40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
ee50: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
ee60: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
ee70: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
ee80: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
ee90: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
eea0: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
eeb0: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
eec0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32   */.        put2
eed0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
eee0: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ], x);.      }. 
eef0: 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61       return &aDa
ef00: 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20  ta[pc + x];.    
ef10: 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63  }.    iAddr = pc
ef20: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
ef30: 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b  yte(&aData[pc]);
ef40: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64 64  .    if( pc<iAdd
ef50: 72 2b 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  r+size ){.      
ef60: 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20 20 20  if( pc ){.      
ef70: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 6c    /* The next sl
ef80: 6f 74 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20  ot in the chain 
ef90: 69 73 20 6e 6f 74 20 70 61 73 74 20 74 68 65 20  is not past the 
efa0: 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  end of the curre
efb0: 6e 74 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20  nt slot */.     
efc0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
efd0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
efe0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
eff0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
f000: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 3e 6d  }.  }.  if( pc>m
f010: 61 78 50 43 2b 6e 42 79 74 65 2d 34 20 29 7b 0a  axPC+nByte-4 ){.
f020: 20 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65 20      /* The free 
f030: 73 6c 6f 74 20 63 68 61 69 6e 20 65 78 74 65 6e  slot chain exten
f040: 64 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ds off the end o
f050: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
f060: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
f070: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
f080: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f090: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  0;.}../*.** Allo
f0a0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
f0b0: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
f0c0: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
f0d0: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
f0e0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
f0f0: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
f100: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
f110: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
f120: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
f130: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
f140: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
f150: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
f160: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
f170: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
f180: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
f190: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
f1a0: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
f1b0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
f1c0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
f1d0: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
f1e0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
f1f0: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
f200: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
f210: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
f220: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
f230: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
f240: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
f250: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
f260: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
f270: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
f280: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
f290: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
f2a0: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
f2b0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
f2c0: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
f2d0: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
f2e0: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
f2f0: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
f300: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
f310: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
f320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
f330: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
f340: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
f350: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
f360: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
f370: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
f380: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
f390: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
f3a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
f3b0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
f3c0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
f3d0: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
f3e0: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
f3f0: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74  aData */.  int t
f400: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
f430: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f440: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ea */.  int rc =
f450: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f470: 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  Integer return c
f480: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  ode */.  int gap
f490: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
f4a0: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
f4b0: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
f4c0: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
f4d0: 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73  tent */.  .  ass
f4e0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
f4f0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
f500: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
f510: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f520: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
f530: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f540: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f550: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
f560: 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b  ert( nByte>=0 );
f570: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
f580: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
f590: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f5a0: 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a  nFree>=nByte );.
f5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f5c0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
f5d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
f5e0: 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e   < (int)(pPage->
f5f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
f600: 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  8) );..  assert(
f610: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
f620: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
f630: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
f640: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
f650: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
f660: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
f670: 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35  assert( gap<=655
f680: 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  36 );.  /* EVIDE
f690: 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d  NCE-OF: R-29356-
f6a0: 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74  02391 If the dat
f6b0: 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35  abase uses a 655
f6c0: 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a  36-byte page siz
f6d0: 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72  e.  ** and the r
f6e0: 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73  eserved space is
f6f0: 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c   zero (the usual
f700: 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72   value for reser
f710: 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20  ved space).  ** 
f720: 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f  then the cell co
f730: 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20  ntent offset of 
f740: 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61  an empty page wa
f750: 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e  nts to be 65536.
f760: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  .  ** However, t
f770: 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74  hat integer is t
f780: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73  oo large to be s
f790: 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74  tored in a 2-byt
f7a0: 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20  e unsigned.  ** 
f7b0: 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61  integer, so a va
f7c0: 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64  lue of 0 is used
f7d0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a   in its place. *
f7e0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
f7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
f800: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c  ;.  assert( top<
f810: 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74  =(int)pPage->pBt
f820: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20  ->usableSize ); 
f830: 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65  /* Prevent by ge
f840: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a  tAndInitPage() *
f850: 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20  /.  if( gap>top 
f860: 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d  ){.    if( top==
f870: 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d  0 && pPage->pBt-
f880: 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35  >usableSize==655
f890: 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20  36 ){.      top 
f8a0: 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c  = 65536;.    }el
f8b0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
f8c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f8d0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
f8e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f8f0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
f900: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61  space between ga
f910: 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e  p and top for on
f920: 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e  e more cell poin
f930: 74 65 72 2c 0a 20 20 2a 2a 20 61 6e 64 20 69 66  ter,.  ** and if
f940: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
f950: 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e   not empty, then
f960: 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a   search the.  **
f970: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
f980: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
f990: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
f9a0: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
f9b0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
f9c0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
f9d0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
f9e0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
f9f0: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
fa00: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
fa10: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
fa20: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
fa30: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
fa40: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
fa50: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
fa60: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
fa70: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
fa80: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
fa90: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
faa0: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
fab0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
fac0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
fad0: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
fae0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
faf0: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
fb00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fb10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fb20: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
fb30: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
fb40: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
fb50: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
fb60: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
fb70: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
fb80: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
fb90: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
fba0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
fbb0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
fbc0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
fbd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fbe0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
fbf0: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73  PT_DB );.    ass
fc00: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
fc10: 65 3e 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  e>=0 );.    rc =
fc20: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
fc30: 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50  pPage, MIN(4, pP
fc40: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b  age->nFree - (2+
fc50: 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66  nByte)));.    if
fc60: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
fc70: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
fc80: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
fc90: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
fca0: 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79  ssert( gap+2+nBy
fcb0: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
fcc0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
fcd0: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
fce0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
fcf0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
fd00: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
fd10: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
fd20: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 43  rea.  The btreeC
fd30: 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28  omputeFreeSpace(
fd40: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
fd50: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
fd60: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
fd70: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
fd80: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
fd90: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
fda0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
fdb0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
fdc0: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
fdd0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
fde0: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
fdf0: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
fe00: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
fe10: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
fe20: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
fe30: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
fe40: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
fe50: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
fe60: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
fe70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
fe80: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
fe90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
feb0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
fec0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
fed0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
fee0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
fef0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
ff00: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
ff10: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
ff20: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
ff30: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
ff40: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
ff50: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
ff60: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
ff70: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
ff80: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  Even though the 
ff90: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
ffa0: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
ffb0: 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70  reeComputeFreeSp
ffc0: 61 63 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  ace(),.** that r
ffd0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
ffe0: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
fff0: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
10000 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
10010 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
10020 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
10030 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
10040 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
10050 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
10060 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10070 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
10080 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
10090 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
100a0 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
100b0 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
100c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
100d0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
100e0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
100f0 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
10100 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
10110 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
10120 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
10130 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
10160 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
10170 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
10180 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
101a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
101b0 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
101c0 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
101f0 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
10200 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
10210 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
10240 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
10250 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
10260 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10280 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
10290 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31  of iSize */.  u1
102a0 36 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 x;            
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
102d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
102e0 65 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64  ea */.  u32 iEnd
102f0 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a   = iStart + iSiz
10300 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
10310 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
10320 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66   the iStart buff
10330 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
10340 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
10350 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a  age->aData;   /*
10360 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f   Page content */
10370 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10380 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
10390 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
103a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
103b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
103c0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
103d0 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74  UPT_DB || iStart
103e0 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
103f0 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c  et+6+pPage->chil
10400 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73  dPtrSize );.  as
10410 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
10420 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67   || iEnd <= pPag
10430 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
10440 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
10450 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10460 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
10470 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10480 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20  t( iSize>=4 );  
10490 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
104a0 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
104b0 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
104c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
104d0 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f  leSize-4 );..  /
104e0 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72  * The list of fr
104f0 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  eeblocks must be
10500 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
10510 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a  der.  Find the .
10520 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65    ** spot on the
10530 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61   list where iSta
10540 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rt should be ins
10550 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64  erted..  */.  hd
10560 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
10570 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68  fset;.  iPtr = h
10580 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61  dr + 1;.  if( da
10590 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26  ta[iPtr+1]==0 &&
105a0 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29   data[iPtr]==0 )
105b0 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d  {.    iFreeBlk =
105c0 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74   0;  /* Shortcut
105d0 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
105e0 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  en the freelist 
105f0 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65  is empty */.  }e
10600 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
10610 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
10620 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
10630 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  ))<iStart ){.   
10640 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
10650 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  iPtr+4 ){.      
10660 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d    if( iFreeBlk==
10670 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
10680 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10690 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
106a0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
106b0 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65      iPtr = iFree
106c0 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Blk;.    }.    i
106d0 66 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67  f( iFreeBlk>pPag
106e0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
106f0 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65  ze-4 ){.      re
10700 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10710 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10720 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
10730 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72  t( iFreeBlk>iPtr
10740 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20   || iFreeBlk==0 
10750 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20  );.  .    /* At 
10760 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20  this point:.    
10770 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20  **    iFreeBlk: 
10780 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63    First freebloc
10790 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20  k after iStart, 
107a0 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a  or zero if none.
107b0 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20      **    iPtr: 
107c0 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73        The addres
107d0 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74  s of a pointer t
107e0 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  o iFreeBlk.    *
107f0 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
10800 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
10810 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
10820 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
10830 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
10840 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
10850 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
10860 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
10870 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
10880 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
10890 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
108a0 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
108b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
108c0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (pPage);.      i
108d0 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
108e0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
108f0 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
10900 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
10910 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
10920 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10940 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10950 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10960 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
10970 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69   iStart;.      i
10980 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
10990 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
109a0 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  k]);.    }.  .  
109b0 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20    /* If iPtr is 
109c0 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63  another freebloc
109d0 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69  k (that is, if i
109e0 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66  Ptr is not the f
109f0 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70  reelist.    ** p
10a00 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
10a10 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20  ge header) then 
10a20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
10a30 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
10a40 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65  .    ** coalesce
10a50 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
10a60 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  f iPtr..    */. 
10a70 20 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b     if( iPtr>hdr+
10a80 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
10a90 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20  PtrEnd = iPtr + 
10aa0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
10ab0 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Ptr+2]);.      i
10ac0 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53  f( iPtrEnd+3>=iS
10ad0 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tart ){.        
10ae0 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61  if( iPtrEnd>iSta
10af0 72 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rt ) return SQLI
10b00 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10b10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
10b20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
10b30 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
10b40 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
10b50 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
10b60 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
10b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10b80 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
10b90 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
10ba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10bb0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10bc0 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
10bd0 46 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20  Frag;.  }.  x = 
10be0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
10bf0 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53  dr+5]);.  if( iS
10c00 74 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f  tart<=x ){.    /
10c10 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
10c20 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
10c30 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
10c40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
10c50 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
10c60 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
10c70 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
10c80 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
10c90 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
10ca0 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
10cb0 2f 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74  /.    if( iStart
10cc0 3c 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b  <x || iPtr!=hdr+
10cd0 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
10ce0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10cf0 50 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62  Page);.    put2b
10d00 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
10d10 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
10d20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10d30 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
10d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
10d50 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
10d60 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
10d70 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
10d80 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10d90 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
10da0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
10db0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
10dc0 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
10dd0 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   ){.    /* Overw
10de0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
10df0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
10e00 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
10e10 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a  ure_delete.    *
10e20 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
10e30 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
10e40 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
10e50 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
10e60 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10e70 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
10e80 6c 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  lk);.  put2byte(
10e90 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c  &data[iStart+2],
10ea0 20 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65   iSize);.  pPage
10eb0 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
10ec0 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
10ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10ee0 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
10ef0 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
10f00 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
10f10 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
10f20 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
10f30 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
10f40 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
10f50 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
10f60 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
10f70 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
10f80 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
10f90 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
10fa0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
10fb0 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
10fc0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
10fd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
10fe0 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
10ff0 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
11000 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
11010 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
11020 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
11030 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
11040 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
11050 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
11060 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
11070 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
11080 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
11090 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
110a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
110b0 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
110c0 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
110d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
110e0 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
110f0 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
11100 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
11110 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11120 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11130 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
11140 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
11150 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
11160 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
11170 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
11180 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
11190 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
111a0 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
111b0 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
111c0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
111d0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a   = cellSizePtr;.
111e0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
111f0 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
11200 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
11210 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
11220 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
11230 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33  CE-OF: R-07291-3
11240 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  5328 A value of 
11250 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74  5 (0x05) means t
11260 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
11270 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61    ** interior ta
11280 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
11290 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
112a0 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
112b0 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a  F_INTKEY)==5 );.
112c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
112d0 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37  OF: R-26900-0917
112e0 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20  6 A value of 13 
112f0 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65  (0x0d) means the
11300 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a   page is a.    *
11310 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74  * leaf table b-t
11320 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
11330 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
11340 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
11350 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
11360 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
11370 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66  tKey = 1;.    if
11380 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
11390 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
113a0 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20  tKeyLeaf = 1;.  
113b0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
113c0 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
113d0 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d  seCellPtr;.    }
113e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
113f0 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
11400 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  0;.      pPage->
11410 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
11420 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
11430 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
11440 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
11450 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
11460 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20  ayload;.    }.  
11470 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
11480 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
11490 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
114a0 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
114b0 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
114c0 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
114d0 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
114e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
114f0 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20  R-43316-37308 A 
11500 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32  value of 2 (0x02
11510 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
11520 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e   is an.    ** in
11530 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74  terior index b-t
11540 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
11550 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
11560 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20  RODATA)==2 );.  
11570 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11580 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20  : R-59615-42828 
11590 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30  A value of 10 (0
115a0 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x0a) means the p
115b0 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20  age is a.    ** 
115c0 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65  leaf index b-tre
115d0 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
115e0 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
115f0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
11600 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
11610 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
11620 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
11630 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
11640 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
11650 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
11660 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67  rIndex;.    pPag
11670 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
11680 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
11690 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
116a0 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
116b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
116c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
116d0 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79  -47608-56469 Any
116e0 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72   other value for
116f0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
11700 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20   type is.    ** 
11710 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  an error. */.   
11720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11730 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
11740 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
11750 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
11760 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
11770 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
11780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11790 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
117a0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
117b0 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
117c0 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
117d0 64 73 2c 20 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74  ds, fill.** in t
117e0 68 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  he pPage->nFree 
117f0 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
11800 20 69 6e 74 20 62 74 72 65 65 43 6f 6d 70 75 74   int btreeComput
11810 65 46 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61  eFreeSpace(MemPa
11820 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
11830 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
11840 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
11850 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
11860 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
11870 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
11880 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11890 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
118a0 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
118b0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
118c0 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
118d0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
118e0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
118f0 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
11900 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
11910 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
11920 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
11930 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11940 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
11950 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
11960 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
11970 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
11980 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
11990 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
119a0 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
119b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
119c0 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
119d0 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
119e0 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
119f0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
11a00 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
11a10 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
11a20 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
11a30 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
11a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11a50 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
11a60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11a70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
11a80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
11a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11aa0 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
11ab0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
11ac0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11ad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11ae0 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
11af0 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11b00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
11b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11b20 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
11b30 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
11b40 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
11b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11b60 3e 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20  >isInit==1 );.  
11b70 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
11b80 46 72 65 65 3c 30 20 29 3b 0a 0a 20 20 75 73 61  Free<0 );..  usa
11b90 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
11ba0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
11bb0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
11bc0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
11bd0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
11be0 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  a;.  /* EVIDENCE
11bf0 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
11c00 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
11c10 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
11c20 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
11c30 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
11c40 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
11c50 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
11c60 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
11c70 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e  teger is.  ** in
11c80 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
11c90 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  36. */.  top = g
11ca0 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
11cb0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
11cc0 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 68 64 72  iCellFirst = hdr
11cd0 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
11ce0 69 6c 64 50 74 72 53 69 7a 65 20 2b 20 32 2a 70  ildPtrSize + 2*p
11cf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  Page->nCell;.  i
11d00 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
11d10 65 53 69 7a 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a  eSize - 4;..  /*
11d20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
11d30 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
11d40 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45   the page.  ** E
11d50 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
11d60 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77  588-34450 The tw
11d70 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
11d80 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73  t offset 1 gives
11d90 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
11da0 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65  of the first fre
11db0 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  eblock on the pa
11dc0 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69  ge, or is zero i
11dd0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
11de0 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   ** freeblocks. 
11df0 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  */.  pc = get2by
11e00 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
11e10 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61  ;.  nFree = data
11e20 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20  [hdr+7] + top;  
11e30 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f  /* Init nFree to
11e40 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66   non-freeblock f
11e50 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  ree space */.  i
11e60 66 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75  f( pc>0 ){.    u
11e70 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  32 next, size;. 
11e80 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
11e90 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  irst ){.      /*
11ea0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11eb0 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61  55530-52930 In a
11ec0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
11ed0 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20  ree page, there 
11ee0 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c  will.      ** al
11ef0 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74  ways be at least
11f00 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65   one cell before
11f10 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62   the first freeb
11f20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
11f30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11f40 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
11f50 70 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20  pPage); .    }. 
11f60 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
11f70 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c       if( pc>iCel
11f80 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
11f90 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66   /* Freeblock of
11fa0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
11fb0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
11fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11fd0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
11fe0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
11ff0 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
12000 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
12010 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
12020 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
12030 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  ;.      nFree = 
12040 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
12050 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63      if( next<=pc
12060 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b  +size+3 ) break;
12070 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
12080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12090 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
120a0 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74  /* Freeblock not
120b0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
120c0 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  der */.      ret
120d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
120e0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
120f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63      }.    if( pc
12100 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20  +size>(unsigned 
12110 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29  int)usableSize )
12120 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  {.      /* Last 
12130 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64  freeblock extend
12140 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20  s past page end 
12150 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
12160 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
12170 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
12180 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  }.  }..  /* At t
12190 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
121a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
121b0 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
121c0 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
121d0 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
121e0 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
121f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
12200 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
12210 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
12220 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
12230 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
12240 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
12250 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ize.  ** of the 
12260 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
12270 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
12280 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
12290 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76  k also.  ** serv
122a0 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
122b0 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
122c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
122d0 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
122e0 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
122f0 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
12300 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
12310 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  in the page..  *
12320 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73  /.  if( nFree>us
12330 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
12340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12350 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
12360 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
12370 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46  nFree = (u16)(nF
12380 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74  ree - iCellFirst
12390 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
123a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
123b0 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
123c0 6e 69 74 79 20 63 68 65 63 6b 20 61 66 74 65 72  nity check after
123d0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
123e0 20 69 66 0a 2a 2a 20 50 52 41 47 4d 41 20 63 65   if.** PRAGMA ce
123f0 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
12400 20 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49   .*/.static SQLI
12410 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
12420 62 74 72 65 65 43 65 6c 6c 53 69 7a 65 43 68 65  btreeCellSizeChe
12430 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ck(MemPage *pPag
12440 65 29 7b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46  e){.  int iCellF
12450 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
12460 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
12470 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
12480 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  fset */.  int iC
12490 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
124a0 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
124b0 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
124c0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  offset */.  int 
124d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
124e0 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
124f0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
12500 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b  ray */.  int sz;
12510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12520 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
12530 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
12540 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12550 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
12560 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
12570 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
12580 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
12590 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
125a0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
125b0 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
125c0 2a 20 4d 61 78 69 6d 75 6d 20 75 73 61 62 6c 65  * Maximum usable
125d0 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
125e0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
125f0 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 53 74  Offset;    /* St
12600 61 72 74 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  art of cell cont
12610 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 69  ent area */..  i
12620 43 65 6c 6c 46 69 72 73 74 20 3d 20 70 50 61 67  CellFirst = pPag
12630 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
12640 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
12650 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
12660 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
12670 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61  eSize;.  iCellLa
12680 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
12690 2d 20 34 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  - 4;.  data = pP
126a0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 63 65  age->aData;.  ce
126b0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
126c0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
126d0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
126e0 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
126f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
12700 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
12710 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
12720 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
12730 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
12740 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12750 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
12760 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12770 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
12780 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
12790 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
127a0 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
127b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
127c0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
127d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 20  );.    }.    sz 
127e0 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
127f0 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
12800 70 63 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61  pc]);.    testca
12810 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
12820 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  eSize );.    if(
12830 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
12840 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
12850 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12860 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
12870 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12890 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
128a0 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
128b0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
128c0 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
128d0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
128e0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
128f0 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
12900 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
12910 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
12920 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
12930 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
12940 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
12950 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
12960 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
12970 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
12980 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
12990 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
129a0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
129b0 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
129c0 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
129d0 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
129e0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
129f0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
12a00 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
12a10 61 67 65 29 7b 0a 20 20 75 38 20 2a 64 61 74 61  age){.  u8 *data
12a20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
12a30 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
12a40 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ata */.  BtShare
12a50 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
12a60 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
12a70 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20   structure */.. 
12a80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12a90 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
12aa0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
12ab0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
12ac0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12ad0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12ae0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12af0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
12b00 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
12b10 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
12b20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
12b30 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
12b40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
12b50 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
12b60 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
12b70 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
12b80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
12b90 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
12ba0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
12bb0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
12bc0 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20  ==0 );..  pBt = 
12bd0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 64 61  pPage->pBt;.  da
12be0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
12bf0 61 20 2b 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  a + pPage->hdrOf
12c00 66 73 65 74 3b 0a 20 20 2f 2a 20 45 56 49 44 45  fset;.  /* EVIDE
12c10 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
12c20 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
12c30 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
12c40 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
12c50 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
12c60 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69  age type. */.  i
12c70 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
12c80 50 61 67 65 2c 20 64 61 74 61 5b 30 5d 29 20 29  Page, data[0]) )
12c90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12ca0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
12cb0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61  (pPage);.  }.  a
12cc0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
12cd0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
12ce0 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
12cf0 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
12d00 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
12d10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
12d20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
12d30 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61  rflow = 0;.  pPa
12d40 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
12d50 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
12d60 74 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63  t + 8 + pPage->c
12d70 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70  hildPtrSize;.  p
12d80 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
12d90 20 64 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 63   data + pPage->c
12da0 68 69 6c 64 50 74 72 53 69 7a 65 20 2b 20 38 3b  hildPtrSize + 8;
12db0 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
12dc0 6e 64 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  nd = pPage->aDat
12dd0 61 20 2b 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a + pBt->usableS
12de0 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ize;.  pPage->aD
12df0 61 74 61 4f 66 73 74 20 3d 20 70 50 61 67 65 2d  ataOfst = pPage-
12e00 3e 61 44 61 74 61 20 2b 20 70 50 61 67 65 2d 3e  >aData + pPage->
12e10 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
12e20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
12e30 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
12e40 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
12e50 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
12e60 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75  ives the.  ** nu
12e70 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
12e80 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
12e90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
12ea0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 33 5d  et2byte(&data[3]
12eb0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
12ec0 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
12ed0 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20  t) ){.    /* To 
12ee0 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
12ef0 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
12f00 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
12f10 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72  corrupt */.    r
12f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
12f30 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
12f40 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
12f50 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
12f60 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
12f70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
12f80 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20  : R-24089-57979 
12f90 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69  If a page contai
12fa0 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69  ns no cells (whi
12fb0 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20  ch is only.  ** 
12fc0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72  possible for a r
12fd0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61  oot page of a ta
12fe0 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
12ff0 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20  s no rows) then 
13000 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20  the.  ** offset 
13010 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
13020 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
13030 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
13040 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a  e minus the.  **
13050 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
13060 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61  ed space. */.  a
13070 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
13080 65 6c 6c 3e 30 0a 20 20 20 20 20 20 20 7c 7c 20  ell>0.       || 
13090 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
130a0 26 64 61 74 61 5b 35 5d 29 3d 3d 70 42 74 2d 3e  &data[5])==pBt->
130b0 75 73 61 62 6c 65 53 69 7a 65 0a 20 20 20 20 20  usableSize.     
130c0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
130d0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
130e0 65 20 3d 20 2d 31 3b 20 20 2f 2a 20 49 6e 64 69  e = -1;  /* Indi
130f0 63 61 74 65 20 74 68 61 74 20 74 68 69 73 20 76  cate that this v
13100 61 6c 75 65 20 69 73 20 79 65 74 20 75 6e 63 6f  alue is yet unco
13110 6d 70 75 74 65 64 20 2a 2f 0a 20 20 70 50 61 67  mputed */.  pPag
13120 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
13130 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c   if( pBt->db->fl
13140 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c  ags & SQLITE_Cel
13150 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 72  lSizeCk ){.    r
13160 65 74 75 72 6e 20 62 74 72 65 65 43 65 6c 6c 53  eturn btreeCellS
13170 69 7a 65 43 68 65 63 6b 28 70 50 61 67 65 29 3b  izeCheck(pPage);
13180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
13190 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
131a0 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
131b0 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
131c0 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
131d0 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
131e0 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
131f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13200 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
13210 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
13220 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
13230 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
13240 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
13250 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
13260 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
13270 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
13280 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
13290 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
132a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
132b0 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
132c0 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
132d0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
132e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
132f0 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
13300 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
13310 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
13320 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
13330 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
13340 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
13350 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13360 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
13370 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
13380 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
13390 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
133a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
133b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
133c0 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
133d0 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65  SECURE ){.    me
133e0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
133f0 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
13400 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
13410 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
13420 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
13430 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61  st = hdr + ((fla
13440 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20  gs&PTF_LEAF)==0 
13450 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d  ? 12 : 8);.  mem
13460 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
13470 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
13480 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
13490 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
134a0 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
134b0 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
134c0 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
134d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
134e0 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
134f0 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
13500 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  gs);.  pPage->ce
13510 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
13520 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
13530 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
13540 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
13550 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
13560 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
13570 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66    pPage->aDataOf
13580 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  st = &data[pPage
13590 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
135a0 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
135b0 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
135c0 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
135d0 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
135e0 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
135f0 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
13600 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
13610 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
13620 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
13630 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
13640 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
13650 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
13660 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
13670 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
13680 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
13690 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
136a0 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
136b0 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
136c0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
136d0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
136e0 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
136f0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
13700 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
13710 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
13720 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
13730 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21  ge);.  if( pgno!
13740 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a  =pPage->pgno ){.
13750 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
13760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
13770 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
13780 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50  .    pPage->pDbP
13790 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
137a0 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20     pPage->pBt = 
137b0 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  pBt;.    pPage->
137c0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
137d0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
137e0 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  t = pgno==1 ? 10
137f0 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  0 : 0;.  }.  ass
13800 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13810 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
13820 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
13830 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
13840 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
13850 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
13860 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
13870 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
13880 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
13890 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
138a0 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65  s if needed.  Se
138b0 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74  e also: btreeGet
138c0 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a  UnusedPage()..**
138d0 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52  .** If the PAGER
138e0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66  _GET_NOCONTENT f
138f0 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
13900 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
13910 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75  not care.** abou
13920 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
13930 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
13940 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
13950 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
13960 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
13970 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
13980 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
13990 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
139a0 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
139b0 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
139c0 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
139d0 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
139e0 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
139f0 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
13a00 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
13a10 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
13a20 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
13a30 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
13a40 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
13a50 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
13a60 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
13a70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
13a80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
13a90 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
13aa0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
13ab0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
13ac0 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
13ad0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
13ae0 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
13af0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
13b00 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
13b10 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
13b20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
13b30 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
13b40 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
13b50 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
13b60 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
13b70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
13b80 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
13b90 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
13ba0 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
13bb0 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
13bc0 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
13bd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13be0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13bf0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13c00 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
13c10 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
13c20 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
13c30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
13c40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13c50 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
13c60 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
13c70 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
13c80 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
13c90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13ca0 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
13cb0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
13cc0 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
13cd0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
13ce0 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
13cf0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
13d00 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
13d10 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
13d20 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
13d30 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
13d40 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
13d50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
13d60 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
13d70 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
13d80 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
13d90 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
13da0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
13db0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13dc0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13dd0 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
13de0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
13df0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
13e00 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
13e10 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
13e20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
13e30 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
13e40 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
13e50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
13e60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
13e70 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13e80 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
13e90 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
13ea0 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
13eb0 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
13ec0 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
13ed0 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
13ee0 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
13ef0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
13f00 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
13f10 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
13f20 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
13f30 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
13f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
13f50 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
13f60 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
13f70 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
13f80 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
13f90 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
13fa0 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
13fb0 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
13fc0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
13fd0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
13fe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
13ff0 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
14000 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
14010 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
14020 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
14030 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
14040 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
14050 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
14060 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
14070 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
14080 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
14090 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
140a0 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
140b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
140c0 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
140d0 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
140e0 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
140f0 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
14100 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
14110 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
14120 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
14130 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
14140 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
14150 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
14160 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
14170 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
14180 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
14190 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
141a0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
141b0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
141c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
141d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
141e0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
14210 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
14220 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
14230 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
14240 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
14250 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
14260 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
14270 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
14280 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
14290 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
142a0 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
142b0 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
142c0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
142d0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
142e0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
142f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14300 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
14310 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
14320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14330 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
14340 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
14350 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
14360 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
14370 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
14380 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
14390 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
143a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
143b0 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
143c0 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
143d0 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
143e0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
143f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
14400 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
14410 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
14420 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20  ge_error1;.  }. 
14430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14440 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
14450 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
14460 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65  **)&pDbPage, bRe
14470 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72  adOnly);.  if( r
14480 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65  c ){.    goto ge
14490 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
144a0 6f 72 31 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  or1;.  }.  *ppPa
144b0 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
144c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
144d0 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
144e0 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69  if( (*ppPage)->i
144f0 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
14500 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
14510 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
14520 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20  o, pBt);.    rc 
14530 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
14540 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  *ppPage);.    if
14550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14560 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  ){.      goto ge
14570 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
14580 6f 72 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  or2;.    }.  }. 
14590 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
145a0 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
145b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
145c0 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
145d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
145e0 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
145f0 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
14600 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
14610 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
14620 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
14630 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
14640 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
14650 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
14660 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
14670 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
14680 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
14690 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
146a0 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
146b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
146c0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
146d0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  );.    goto getA
146e0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
146f0 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
14700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
14710 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
14720 32 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  2:.  releasePage
14730 28 2a 70 70 50 61 67 65 29 3b 0a 67 65 74 41 6e  (*ppPage);.getAn
14740 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31  dInitPage_error1
14750 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
14760 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
14770 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  -;.    pCur->pPa
14780 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
14790 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
147a0 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
147b0 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pgno==0 );.  ass
147c0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20  ert( pgno!=0 || 
147d0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
147e0 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  PT );.  return r
147f0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14800 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
14810 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20  RENT./* .** Set 
14820 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
14830 20 4d 65 6d 50 61 67 65 2e 70 67 6e 6f 52 6f 6f   MemPage.pgnoRoo
14840 74 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 69  t variable, if i
14850 74 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74 61  t exists..*/.sta
14860 74 69 63 20 76 6f 69 64 20 73 65 74 4d 65 6d 70  tic void setMemp
14870 61 67 65 52 6f 6f 74 28 4d 65 6d 50 61 67 65 20  ageRoot(MemPage 
14880 2a 70 50 67 2c 20 75 33 32 20 70 67 6e 6f 52 6f  *pPg, u32 pgnoRo
14890 6f 74 29 7b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  ot){.  pPg->pgno
148a0 52 6f 6f 74 20 3d 20 70 67 6e 6f 52 6f 6f 74 3b  Root = pgnoRoot;
148b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
148c0 65 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74  e setMempageRoot
148d0 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
148e0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
148f0 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
14900 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
14910 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
14920 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
14930 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  eeGetPage..**.**
14940 20 50 61 67 65 31 20 69 73 20 61 20 73 70 65 63   Page1 is a spec
14950 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73  ial case and mus
14960 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75 73  t be released us
14970 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f  ing releasePageO
14980 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ne()..*/.static 
14990 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
149a0 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20  NotNull(MemPage 
149b0 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  *pPage){.  asser
149c0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
149d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
149e0 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
149f0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
14a00 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
14a10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
14a20 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
14a30 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
14a40 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
14a50 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
14a60 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
14a70 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
14a80 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
14a90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14aa0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
14ab0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14ac0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
14ad0 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
14ae0 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74  pDbPage);.}.stat
14af0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
14b00 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
14b10 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
14b20 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f   ) releasePageNo
14b30 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a  tNull(pPage);.}.
14b40 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
14b50 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61  asePageOne(MemPa
14b60 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
14b70 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
14b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
14b90 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
14ba0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
14bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
14bc0 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
14bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
14be0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
14bf0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
14c00 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
14c10 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
14c20 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
14c30 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
14c40 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
14c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
14c60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14c70 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
14c80 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
14c90 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e  PagerUnrefPageOn
14ca0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
14cb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
14cc0 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a  an unused page..
14cd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
14ce0 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65   just like btree
14cf0 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74  GetPage() with t
14d00 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a  he addition:.**.
14d10 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70  **   *  If the p
14d20 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
14d30 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f  n use for some o
14d40 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d  ther purpose, im
14d50 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20  mediately.**    
14d60 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64    release it and
14d70 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
14d80 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CURRUPT error.
14d90 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75  .**   *  Make su
14da0 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c  re the isInit fl
14db0 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73  ag is clear.*/.s
14dc0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
14dd0 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20  etUnusedPage(.  
14de0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
14df0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
14e00 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
14e10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
14e20 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
14e30 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
14e40 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
14e50 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
14e60 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
14e70 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
14e80 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
14e90 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
14ea0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
14eb0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
14ec0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14ed0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
14ee0 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
14ef0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  , flags);.  if( 
14f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14f10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14f20 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
14f30 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
14f40 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
14f50 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
14f60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
14f70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
14f80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14f90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
14fa0 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
14fb0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
14fc0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
14fd0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
14fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
14ff0 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
15000 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
15010 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
15020 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
15030 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
15040 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
15050 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
15060 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
15070 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
15080 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15090 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
150a0 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
150b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
150c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
150d0 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
150e0 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
150f0 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
15100 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
15110 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
15120 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
15130 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
15140 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
15150 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
15160 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
15170 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
15180 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
15190 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
151a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
151b0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
151c0 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
151d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
151e0 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
151f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15200 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
15210 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15220 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
15230 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
15240 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
15250 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
15260 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
15270 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
15280 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
15290 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
152a0 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
152b0 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
152c0 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
152d0 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
152e0 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
152f0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
15300 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  o btreeInitPage(
15310 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  ) will likely re
15320 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
15330 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75  UPT..      ** Bu
15340 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e  t no harm is don
15350 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20  e by this.  And 
15360 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72  it is very impor
15370 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20  tant that.      
15380 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
15390 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
153a0 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
153b0 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
153c0 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
153d0 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
153e0 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
153f0 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
15400 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
15410 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
15420 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
15430 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
15440 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
15450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15460 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
15470 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
15480 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
15490 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a  pBt = (BtShared*
154a0 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28  )pArg;.  assert(
154b0 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73   pBt->db );.  as
154c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
154d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62  tex_held(pBt->db
154e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
154f0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f  turn sqlite3Invo
15500 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70  keBusyHandler(&p
15510 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64  Bt->db->busyHand
15520 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ler,.           
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
15550 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
15560 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ger));.}../*.** 
15570 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
15580 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
15590 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
155a0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
155b0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
155c0 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
155d0 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
155e0 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
155f0 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
15600 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
15610 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
15620 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
15630 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
15640 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
15650 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
15660 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
15670 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
15680 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
15690 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
156a0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
156b0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
156c0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
156d0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
156e0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
156f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
15700 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
15710 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
15720 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
15730 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
15740 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
15750 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
15760 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
15770 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
15780 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
15790 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
157a0 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
157b0 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
157c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
157d0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
157e0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
157f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15800 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
15810 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
15820 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
15830 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
15840 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
15850 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
15860 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
15870 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
15880 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
15890 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
158a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
158b0 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
158c0 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
158d0 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
158e0 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
158f0 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
15900 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
15910 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
15920 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
15930 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
15940 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
15950 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
15960 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
15970 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
15980 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
15990 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
159a0 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
159b0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
159c0 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
159d0 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
159e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
159f0 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
15a00 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
15a10 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
15a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
15a30 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
15a40 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
15a50 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
15a60 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
15a70 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
15a80 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
15a90 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
15aa0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
15ab0 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
15ac0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
15ad0 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15af0 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
15b00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
15b10 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
15b20 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
15b30 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
15b40 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
15b50 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
15b60 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
15b70 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
15b80 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
15b90 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
15ba0 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
15bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
15bc0 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
15bd0 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
15be0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
15bf0 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
15c00 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
15c10 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
15c20 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
15c30 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
15c40 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
15c50 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
15c60 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
15c70 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
15c80 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
15c90 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
15ca0 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
15cb0 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
15cc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15cd0 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
15ce0 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
15cf0 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
15d00 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
15d10 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
15d20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
15d30 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
15d40 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
15d50 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
15d60 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
15d70 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
15d80 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
15d90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
15da0 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
15db0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
15dc0 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
15de0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
15df0 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
15e00 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
15e10 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
15e20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
15e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
15e40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15e50 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15e60 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
15e70 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
15e80 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
15e90 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
15ea0 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
15eb0 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
15ec0 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
15ed0 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
15ee0 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
15ef0 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
15f00 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
15f10 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
15f20 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
15f30 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
15f40 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
15f50 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
15f60 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
15f70 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
15f80 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
15f90 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
15fa0 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
15fb0 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
15fc0 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
15fd0 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
15fe0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
15ff0 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
16000 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
16010 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
16020 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
16030 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
16040 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
16050 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
16060 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
16070 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
16080 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
16090 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
160a0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
160b0 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
160c0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
160d0 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
160e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
160f0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
16100 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
16110 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
16120 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
16130 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
16140 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16150 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
16160 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16170 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
16180 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
16190 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
161a0 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
161b0 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
161c0 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
161d0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
161e0 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
161f0 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
16200 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
16210 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
16220 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
16230 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
16240 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
16250 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
16260 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
16270 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
16280 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
16290 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
162a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
162b0 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
162c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
162d0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
162e0 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
162f0 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
16300 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
16310 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
16320 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
16330 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
16340 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
16350 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
16360 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
16370 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
16380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16390 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
163a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
163b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
163c0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d  .      if( isMem
163d0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  db ){.        me
163e0 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61  mcpy(zFullPathna
163f0 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  me, zFilename, n
16400 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
16410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16420 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
16430 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
16440 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
16470 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
16480 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
16490 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
164a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
164b0 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
164c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
164d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
164e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
164f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
16500 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
16510 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
16520 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
16530 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
16540 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16550 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
16560 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
16570 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
16580 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
16590 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
165a0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
165b0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
165c0 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
165d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
165e0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23  (mutexShared);.#
165f0 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
16600 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
16610 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
16620 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
16630 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
16640 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
16650 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
16660 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
16670 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
16680 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
16690 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
166a0 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20  ->pPager, 0)).  
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
166c0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
166d0 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
166e0 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
166f0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
16700 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
16710 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
16720 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
16730 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
16740 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
16750 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
16760 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
16770 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
16780 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
16790 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
167a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
167b0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
167c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
167d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
167e0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
167f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16800 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
16810 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
16820 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16830 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
16840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16850 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
16860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16880 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
16890 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
168a0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
168b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
168c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
168d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
168e0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
168f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
16900 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
16910 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
16920 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
16930 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
16940 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
16950 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
16960 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
16970 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
16980 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
16990 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
169a0 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
169b0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
169c0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
169d0 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
169e0 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
169f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16a00 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
16a10 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
16a20 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
16a30 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
16a40 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
16a50 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
16a60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
16a70 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
16a80 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
16a90 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
16aa0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
16ab0 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
16ac0 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
16ad0 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
16ae0 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
16af0 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
16b00 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
16b10 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
16b20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
16b30 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
16b40 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
16b50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
16b60 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b  izeof(i64)==8 );
16b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
16b80 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(u64)==8 );. 
16b90 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16ba0 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
16bb0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16bc0 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
16bd0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
16be0 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
16bf0 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
16c00 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
16c10 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
16c20 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
16c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
16c40 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
16c50 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
16c60 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
16c70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16c80 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
16c90 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
16ca0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16cc0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66  zeof(MemPage), f
16cd0 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
16ce0 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
16cf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
16d10 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
16d20 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
16d30 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20  , db->szMmap);. 
16d40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16d50 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
16d60 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
16d70 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
16d80 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
16d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
16da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16db0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
16dc0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
16dd0 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67     pBt->openFlag
16de0 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20  s = (u8)flags;. 
16df0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b     pBt->db = db;
16e00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
16e10 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28  rSetBusyHandler(
16e20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
16e30 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
16e40 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
16e50 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
16e60 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
16e70 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
16e80 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69  Page1 = 0;.    i
16e90 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  f( sqlite3PagerI
16ea0 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
16eb0 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74  Pager) ) pBt->bt
16ec0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
16ed0 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66  AD_ONLY;.#if def
16ee0 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55  ined(SQLITE_SECU
16ef0 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70  RE_DELETE).    p
16f00 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16f10 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
16f20 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  E;.#elif defined
16f30 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43  (SQLITE_FAST_SEC
16f40 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
16f50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
16f60 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a   BTS_OVERWRITE;.
16f70 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
16f80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
16f90 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
16fa0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
16fb0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
16fc0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
16fd0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
16fe0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
16ff0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
17000 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
17010 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
17020 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17030 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
17040 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
17050 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
17060 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
17070 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
17080 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
17090 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
170a0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
170b0 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
170c0 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
170d0 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
170e0 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
170f0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
17100 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
17110 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17120 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
17130 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
17140 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
17150 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
17160 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
17170 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
17180 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
17190 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
171a0 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
171b0 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
171c0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
171d0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
171e0 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
171f0 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
17200 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
17210 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
17220 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
17230 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
17240 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
17250 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
17260 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
17270 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
17280 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
17290 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
172a0 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
172b0 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
172c0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
172d0 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
172e0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
172f0 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
17300 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
17310 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
17320 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
17330 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
17340 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
17350 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
17360 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
17370 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
17380 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
17390 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
173a0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
173b0 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
173c0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
173d0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
173e0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
173f0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
17400 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
17410 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17420 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
17430 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
17440 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
17450 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
17460 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
17470 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
17480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17490 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
174a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
174b0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
174c0 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
174d0 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
174e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
174f0 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
17500 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
17510 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
17520 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
17530 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
17540 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
17550 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
17560 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
17570 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
17580 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
17590 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
175a0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
175b0 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
175c0 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
175d0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
175e0 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
175f0 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
17600 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
17610 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17620 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
17630 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
17640 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
17650 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
17660 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
17670 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
17680 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
17690 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
176a0 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  */.    pBt->nRef
176b0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 1;.    if( p-
176c0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
176d0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
176e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
176f0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
17700 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
17710 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
17720 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
17730 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
17740 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
17750 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
17760 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
17770 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17780 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
17790 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
177a0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
177b0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
177c0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
177d0 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
177e0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
177f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17800 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
17810 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
17820 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
17830 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
17840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17850 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
17860 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
17870 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
17880 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
17890 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
178a0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
178b0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
178c0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
178d0 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
178e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
178f0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
17900 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
17910 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
17920 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
17930 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
17940 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
17950 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
17960 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
17970 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
17980 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
17990 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
179a0 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
179b0 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
179c0 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
179d0 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
179e0 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
179f0 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
17a00 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
17a10 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
17a20 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
17a30 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
17a40 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
17a50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
17a60 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
17a70 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
17a80 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
17a90 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
17aa0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
17ab0 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
17ac0 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
17ad0 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
17ae0 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29        if( (uptr)
17af0 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69  p->pBt<(uptr)pSi
17b00 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
17b10 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
17b20 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
17b30 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
17b40 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
17b50 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
17b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17b70 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
17b80 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69  ext && (uptr)pSi
17b90 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75  b->pNext->pBt<(u
17ba0 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20  ptr)p->pBt ){.  
17bb0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
17bc0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
17bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17be0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
17bf0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
17c00 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
17c10 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
17c20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
17c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
17c40 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
17c50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17c60 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
17c70 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
17c80 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
17c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17ca0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
17cb0 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
17cc0 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
17cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17ce0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
17cf0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
17d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
17d10 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
17d20 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
17d30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17d40 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
17d50 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
17d60 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
17d70 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
17d80 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a  e3_file *pFile;.
17d90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
17da0 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
17db0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
17dc0 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
17dd0 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
17de0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
17df0 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
17e00 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
17e10 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
17e20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
17e30 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
17e40 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
17e50 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
17e60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
17e70 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
17e80 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
17e90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
17ea0 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
17eb0 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
17ec0 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
17ed0 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  E);.    }..    p
17ee0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
17ef0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
17f00 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ger);.    if( pF
17f10 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  ile->pMethods ){
17f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
17f30 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
17f40 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43  pFile, SQLITE_FC
17f50 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29  NTL_PDB, (void*)
17f60 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  &pBt->db);.    }
17f70 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
17f80 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
17f90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17fa0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
17fb0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
17fc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
17fd0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61  exOpen);.  }.  a
17fe0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
17ff0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42  E_OK || sqlite3B
18000 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f  treeConnectionCo
18010 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20  unt(*ppBtree)>0 
18020 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18030 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
18040 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
18050 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
18060 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
18070 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
18080 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
18090 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
180a0 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
180b0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
180c0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
180d0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
180e0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
180f0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
18100 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
18110 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
18120 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
18130 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
18140 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
18150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
18160 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
18170 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
18180 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
18190 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
181a0 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
181b0 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
181c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
181d0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
181e0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
181f0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
18200 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
18210 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
18220 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
18230 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
18240 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
18250 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
18260 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
18270 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
18280 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
18290 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
182a0 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
182b0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
182c0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
182d0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
182e0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
182f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
18300 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
18310 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
18320 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
18330 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
18340 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
18350 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
18360 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
18370 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
18380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18390 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
183a0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
183b0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
183c0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
183d0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
183e0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
183f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
18400 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
18410 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
18420 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
18430 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18440 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
18450 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
18460 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
18470 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
18480 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
18490 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
184a0 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
184b0 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
184c0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
184d0 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79  ytes with a 4-by
184e0 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20  te prefix for a 
184f0 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f  left-child.** po
18500 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
18510 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
18520 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
18530 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
18540 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
18550 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
18560 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
18570 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
18580 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
18590 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
185a0 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
185b0 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
185c0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
185d0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
185e0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
185f0 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
18600 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
18610 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
18620 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
18630 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
18640 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
18650 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
18660 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
18670 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
18680 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
18690 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
186a0 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
186b0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
186c0 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
186d0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
186e0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
186f0 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
18700 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
18710 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
18720 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
18730 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
18740 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
18750 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
18760 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
18770 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
18780 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
18790 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
187a0 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
187b0 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
187c0 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
187d0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
187e0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
187f0 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
18800 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
18810 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
18820 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20  p space here..  
18830 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
18840 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20  :  Provide four 
18850 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c  bytes of initial
18860 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72  ized space befor
18870 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67  e the.    ** beg
18880 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70  inning of pTmpSp
18890 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61  ace as an area a
188a0 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70  vailable to prep
188b0 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c  end the.    ** l
188c0 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  eft-child pointe
188d0 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  r to the beginni
188e0 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20  ng of a cell..  
188f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
18900 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
18910 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d       memset(pBt-
18920 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38  >pTmpSpace, 0, 8
18930 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54  );.      pBt->pT
18940 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20  mpSpace += 4;.  
18950 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
18960 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
18970 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
18980 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
18990 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
189a0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
189b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70  .  if( pBt->pTmp
189c0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
189d0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34  ->pTmpSpace -= 4
189e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
189f0 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  eFree(pBt->pTmpS
18a00 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  pace);.    pBt->
18a10 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20  pTmpSpace = 0;. 
18a20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
18a30 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
18a40 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
18a50 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
18a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18a70 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
18a80 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
18a90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
18aa0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
18ab0 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
18ac0 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
18ad0 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
18ae0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
18af0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18b00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
18b10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18b20 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
18b30 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
18b40 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
18b50 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
18b60 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
18b70 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
18b80 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
18b90 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
18ba0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
18bb0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
18bc0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
18bd0 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
18be0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
18bf0 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
18c00 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
18c10 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
18c20 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
18c30 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
18c40 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
18c50 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
18c60 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
18c70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
18c80 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
18c90 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
18ca0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18cb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
18cc0 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
18cd0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
18ce0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
18cf0 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
18d00 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
18d10 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
18d20 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
18d30 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
18d40 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
18d50 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
18d60 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
18d70 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
18d80 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
18d90 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
18da0 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
18db0 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
18dc0 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
18dd0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
18de0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
18df0 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
18e00 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
18e10 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
18e20 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
18e30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
18e40 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
18e50 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
18e60 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
18e70 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
18e80 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
18e90 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
18ea0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
18eb0 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  db);.    if( pBt
18ec0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
18ed0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
18ee0 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
18ef0 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
18f00 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
18f10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
18f20 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
18f30 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
18f40 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
18f50 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
18f60 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
18f70 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
18f80 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
18f90 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
18fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
18fb0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
18fc0 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
18fd0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
18fe0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
18ff0 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
19000 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
19010 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
19020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
19030 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19040 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19050 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74  Change the "soft
19060 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
19070 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19080 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
19090 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64  Unused and unmod
190a0 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c  ified pages will
190b0 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65   be recycled whe
190c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
190d0 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
190e0 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68  cache exceeds th
190f0 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20  is soft limit.  
19100 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  But the size of 
19110 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20  the.** cache is 
19120 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20  allowed to grow 
19130 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
19140 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e   limit if it con
19150 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70  tains.** dirty p
19160 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74  ages or pages st
19170 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73  ill in active us
19180 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
19190 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
191a0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
191b0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
191c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
191d0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
191e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
191f0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
19200 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19210 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
19220 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
19230 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
19240 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
19250 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19260 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19270 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19280 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c  Change the "spil
19290 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  l" limit on the 
192a0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
192b0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
192c0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
192d0 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20  f pages exceeds 
192e0 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e  this limit durin
192f0 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
19300 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61  ction,.** the pa
19310 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ger might attemp
19320 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67  t to "spill" pag
19330 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
19340 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72  l early in.** or
19350 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
19360 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
19370 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19380 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  is the current s
19390 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a  pill size.  If z
193a0 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a  ero is passed.**
193b0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   as an argument,
193c0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
193d0 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c  made to the spil
193e0 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20  l size setting, 
193f0 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61  so.** using mxPa
19400 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79  ge of 0 is a way
19410 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
19420 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
19430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19440 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
19450 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
19460 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
19470 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19480 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  t;.  int res;.  
19490 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
194a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
194b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
194c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
194d0 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  p);.  res = sqli
194e0 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
194f0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
19500 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
19510 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19520 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
19530 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
19540 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
19550 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19560 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
19570 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
19580 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
19590 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
195a0 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
195b0 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
195c0 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
195d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
195e0 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
195f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19600 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
19610 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19620 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
19630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19640 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
19650 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
19660 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
19670 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
19680 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
196a0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
196b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
196c0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
196d0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
196e0 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
196f0 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
19700 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
19710 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
19720 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
19730 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
19740 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19750 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
19760 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
19770 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
19780 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
19790 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
197a0 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
197b0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
197c0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
197d0 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
197e0 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
197f0 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
19800 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
19810 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
19820 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
19830 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
19840 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
19850 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
19860 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
19870 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
19880 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
19890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
198a0 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
198b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
198c0 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
198d0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
198e0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
198f0 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
19900 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
19910 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
19920 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
19930 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
19940 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
19950 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19960 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19970 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
19980 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
19990 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
199a0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
199b0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
199c0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
199d0 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
199e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
199f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19a00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19a10 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
19a20 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
19a30 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
19a40 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
19a50 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
19a60 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
19a70 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
19a80 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
19a90 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
19aa0 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
19ab0 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
19ac0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
19ad0 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
19ae0 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
19af0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
19b00 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
19b10 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
19b20 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
19b30 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
19b40 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
19b50 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
19b60 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
19b70 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
19b80 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
19b90 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
19ba0 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
19bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19bc0 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
19bd0 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
19be0 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
19bf0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
19c00 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
19c10 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
19c20 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
19c30 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
19c40 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
19c50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
19c60 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
19c70 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
19c80 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
19c90 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
19ca0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
19cb0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
19cc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
19cd0 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
19ce0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
19cf0 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
19d00 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
19d10 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
19d20 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
19d30 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
19d40 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
19d50 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
19d60 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
19d70 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
19d80 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
19d90 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
19da0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
19db0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19dc0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
19dd0 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
19de0 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
19df0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19e00 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
19e10 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19e20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
19e30 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
19e40 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
19e50 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
19e60 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
19e70 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
19e80 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
19e90 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
19ea0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19eb0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
19ec0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
19ed0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
19ee0 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
19ef0 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
19f00 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
19f10 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
19f20 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
19f30 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
19f40 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
19f50 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
19f60 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
19f70 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
19f80 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
19f90 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
19fa0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
19fb0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
19fd0 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
19fe0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
19ff0 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
1a000 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
1a010 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
1a020 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1a030 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
1a040 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
1a050 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
1a060 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
1a070 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
1a080 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
1a090 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
1a0a0 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
1a0b0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
1a0c0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
1a0d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a0e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a0f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1a100 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
1a110 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
1a120 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
1a130 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
1a140 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
1a150 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
1a160 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
1a170 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1a180 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
1a190 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
1a1a0 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
1a1b0 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
1a1c0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
1a1d0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
1a1e0 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
1a1f0 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
1a200 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
1a210 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
1a220 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
1a230 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
1a240 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
1a250 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
1a260 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
1a270 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
1a280 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
1a290 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
1a2a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
1a2b0 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
1a2c0 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
1a2d0 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
1a2e0 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
1a2f0 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
1a300 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
1a310 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
1a320 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
1a330 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
1a340 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
1a350 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
1a360 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
1a370 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a380 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
1a390 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
1a3a0 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
1a3b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a3c0 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
1a3d0 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
1a3e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
1a3f0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1a400 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
1a410 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a420 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a430 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
1a440 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
1a450 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
1a460 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
1a470 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
1a480 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
1a490 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
1a4a0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
1a4b0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
1a4c0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1a4d0 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
1a4e0 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
1a4f0 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
1a500 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
1a510 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1a520 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
1a530 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
1a540 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
1a550 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
1a560 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a570 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
1a580 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1a590 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
1a5a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
1a5b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a5c0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
1a5d0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1a5e0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
1a5f0 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
1a600 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
1a610 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
1a620 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
1a630 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a640 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a650 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
1a660 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
1a670 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
1a680 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
1a690 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
1a6a0 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
1a6b0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
1a6c0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
1a6d0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
1a6e0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
1a6f0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
1a700 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
1a710 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
1a720 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
1a730 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
1a740 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
1a750 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
1a760 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a770 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
1a780 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
1a790 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
1a7a0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
1a7b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a7c0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
1a7d0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
1a7e0 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54 53  lues for the BTS
1a7f0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61  _SECURE_DELETE a
1a800 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
1a810 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
1a820 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20   newFlag==0     
1a830 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52    Both BTS_SECUR
1a840 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53  E_DELETE and BTS
1a850 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20 63  _OVERWRITE are c
1a860 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77  leared.**    new
1a870 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54  Flag==1       BT
1a880 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
1a890 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  set and BTS_OVER
1a8a0 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65 64  WRITE is cleared
1a8b0 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
1a8c0 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55  2       BTS_SECU
1a8d0 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65  RE_DELETE cleare
1a8e0 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  d and BTS_OVERWR
1a8f0 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  ITE is set.**   
1a900 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20   newFlag==(-1)  
1a910 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a    No changes.**.
1a920 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a930 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79 20  acts as a query 
1a940 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65  if newFlag is le
1a950 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a  ss than zero.**.
1a960 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52  ** With BTS_OVER
1a970 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74  WRITE set, delet
1a980 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76  ed content is ov
1a990 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72  erwritten by zer
1a9a0 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c  os, but.** freel
1a9b0 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61  ist leaf pages a
1a9c0 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62  re not written b
1a9d0 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
1a9e0 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61  ase.  Thus in-pa
1a9f0 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f  ge.** deleted co
1aa00 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64  ntent is cleared
1aa10 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20 64  , but freelist d
1aa20 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
1aa30 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  s not..**.** Wit
1aa40 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  h BTS_SECURE_DEL
1aa50 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69  ETE, operation i
1aa60 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57  s like BTS_OVERW
1aa70 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61 64  RITE with the ad
1aa80 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66  dition.** that f
1aa90 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
1aaa0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 62  es are written b
1aab0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
1aac0 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e  abase, increasin
1aad0 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20  g.** the amount 
1aae0 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a  of disk I/O..*/.
1aaf0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ab00 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
1ab10 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
1ab20 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
1ab30 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1ab40 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
1ab50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1ab60 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57  ssert( BTS_OVERW
1ab70 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45  RITE==BTS_SECURE
1ab80 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61  _DELETE*2 );.  a
1ab90 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f  ssert( BTS_FAST_
1aba0 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45  SECURE==(BTS_OVE
1abb0 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52  RWRITE|BTS_SECUR
1abc0 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69  E_DELETE) );.  i
1abd0 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
1abe0 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
1abf0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41  Flags &= ~BTS_FA
1ac00 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70  ST_SECURE;.    p
1ac10 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
1ac20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
1ac30 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20  LETE*newFlag;.  
1ac40 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d  }.  b = (p->pBt-
1ac50 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1ac60 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53  FAST_SECURE)/BTS
1ac70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
1ac80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ac90 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1aca0 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
1acb0 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
1acc0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
1acd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1ace0 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
1acf0 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
1ad00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1ad10 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
1ad20 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
1ad30 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
1ad40 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
1ad50 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
1ad60 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
1ad70 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
1ad80 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
1ad90 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
1ada0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
1adb0 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
1adc0 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
1add0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
1ade0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
1adf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
1ae00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ae10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1ae20 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
1ae30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ae40 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1ae50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ae60 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
1ae70 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
1ae80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ae90 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
1aea0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
1aeb0 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
1aec0 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
1aed0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1aee0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1aef0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
1af00 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
1af10 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
1af20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
1af30 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
1af40 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
1af50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1af60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
1af70 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
1af80 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
1af90 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
1afa0 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
1afb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
1afc0 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
1afd0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1afe0 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
1aff0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
1b000 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
1b010 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
1b020 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b030 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
1b040 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
1b050 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
1b060 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b070 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1b080 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
1b090 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
1b0a0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
1b0b0 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
1b0c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
1b0d0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
1b0e0 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
1b0f0 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
1b100 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
1b110 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b120 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
1b130 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1b140 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74  user has not set
1b150 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
1b160 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  l for this datab
1b170 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
1b180 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20  * using "PRAGMA 
1b190 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e  synchronous", an
1b1a0 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79 2d  d if the safety-
1b1b0 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72  level is not alr
1b1c0 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74  eady.** set to t
1b1d0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
1b1e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1b1f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
1b200 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74  arameter,.** set
1b210 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53   it so..*/.#if S
1b220 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
1b230 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54  NCHRONOUS!=SQLIT
1b240 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
1b250 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20  NCHRONOUS \.    
1b260 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1b270 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61  TE_OMIT_WAL).sta
1b280 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66 61  tic void setDefa
1b290 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68  ultSyncFlag(BtSh
1b2a0 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61  ared *pBt, u8 sa
1b2b0 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73  fety_level){.  s
1b2c0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
1b2d0 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62   *pDb;.  if( (db
1b2e0 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20  =pBt->db)!=0 && 
1b2f0 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30  (pDb=db->aDb)!=0
1b300 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
1b310 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44  Db->pBt==0 || pD
1b320 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74  b->pBt->pBt!=pBt
1b330 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20   ){ pDb++; }.   
1b340 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53   if( pDb->bSyncS
1b350 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  et==0 .     && p
1b360 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1b370 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a  !=safety_level .
1b380 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64 62       && pDb!=&db
1b390 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b  ->aDb[1] .    ){
1b3a0 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65  .      pDb->safe
1b3b0 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74  ty_level = safet
1b3c0 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73  y_level;.      s
1b3d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
1b3e0 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
1b3f0 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
1b400 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28  safety_level | (
1b410 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45  db->flags & PAGE
1b420 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a  R_FLAGS_MASK));.
1b430 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
1b440 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44 65  e.# define setDe
1b450 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
1b460 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a  t,safety_level).
1b470 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
1b480 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
1b490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
1b4a0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
1b4b0 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  d*);.../*.** Get
1b4c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1b4d0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
1b4e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
1b4f0 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
1b500 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
1b510 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
1b520 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1b530 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1b540 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
1b550 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
1b560 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
1b570 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
1b580 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1b590 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1b5a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1b5b0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1b5c0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
1b5d0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
1b5e0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
1b5f0 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
1b600 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
1b610 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
1b620 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
1b630 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1b640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b650 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
1b660 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
1b670 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1b680 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
1b690 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b6a0 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ile */.  u32 nPa
1b6b0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
1b6c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1b6d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b6e0 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 46   */.  u32 nPageF
1b6f0 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
1b700 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1b710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b720 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67  le */.  u32 nPag
1b730 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
1b740 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1b750 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1b760 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
1b770 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1b780 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b790 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1b7a0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1b7b0 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
1b7c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b7d0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
1b7e0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
1b7f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b800 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
1b810 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1b820 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1b830 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b840 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b850 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
1b860 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
1b870 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
1b880 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
1b890 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
1b8a0 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
1b8b0 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
1b8c0 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
1b8d0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
1b8e0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
1b8f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1b900 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1b910 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e 50  Pager, (int*)&nP
1b920 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
1b930 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
1b940 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
1b950 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
1b960 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
1b970 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
1b980 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
1b990 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e    }.  if( (pBt->
1b9a0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1b9b0 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
1b9c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
1b9d0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
1b9e0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
1b9f0 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
1ba00 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
1ba10 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
1ba20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
1ba30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ba40 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
1ba50 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
1ba60 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
1ba70 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
1ba80 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
1ba90 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
1baa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
1bab0 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
1bac0 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
1bad0 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
1bae0 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
1baf0 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
1bb00 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
1bb10 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
1bb20 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
1bb30 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1bb40 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
1bb50 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1bb60 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
1bb70 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
1bb80 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1bb90 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1bba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bbb0 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
1bbc0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1bbd0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1bbe0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
1bbf0 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
1bc00 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1bc10 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
1bc20 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
1bc30 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
1bc40 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1bc50 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1bc60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1bc70 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
1bc80 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
1bc90 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
1bca0 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
1bcb0 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
1bcc0 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
1bcd0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1bce0 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
1bcf0 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
1bd00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bd10 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
1bd20 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
1bd30 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
1bd40 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
1bd50 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
1bd60 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
1bd70 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
1bd80 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
1bd90 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
1bda0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
1bdb0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
1bdc0 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
1bdd0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
1bde0 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
1bdf0 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
1be00 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
1be10 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
1be20 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1be30 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
1be40 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1be50 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
1be60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1be70 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
1be80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1be90 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
1bea0 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
1beb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bed0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1bee0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1bef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bf00 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
1bf10 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
1bf20 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
1bf30 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20  NCHRONOUS+1);.  
1bf40 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
1bf50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1bf60 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1bf70 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
1bf80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bf90 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
1bfa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1bfb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
1bfc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bfd0 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
1bfe0 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
1bff0 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
1c000 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23  NOUS+1);.    }.#
1c010 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
1c020 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
1c030 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
1c040 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
1c050 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
1c060 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
1c070 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
1c080 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
1c090 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1c0a0 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
1c0b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1c0c0 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
1c0d0 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
1c0e0 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
1c0f0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
1c100 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
1c110 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
1c120 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
1c130 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
1c140 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
1c150 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
1c160 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
1c170 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1c180 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1c190 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1c1a0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
1c1b0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
1c1c0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1c1d0 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
1c1e0 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
1c1f0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
1c200 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
1c210 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
1c220 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
1c230 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
1c240 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1c250 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
1c260 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
1c270 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
1c280 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1c290 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
1c2a0 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
1c2b0 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
1c2c0 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
1c2d0 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
1c2e0 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
1c2f0 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
1c300 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
1c310 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
1c320 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
1c330 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
1c340 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
1c350 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
1c360 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1c370 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1c380 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1c390 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
1c3a0 46 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65 72  FIXED;.    asser
1c3b0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
1c3c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
1c3d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
1c3e0 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
1c3f0 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
1c400 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
1c410 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
1c420 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
1c430 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c440 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
1c450 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
1c460 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
1c470 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
1c480 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
1c490 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1c4a0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
1c4b0 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
1c4c0 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
1c4d0 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
1c4e0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
1c4f0 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
1c500 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
1c510 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
1c520 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
1c530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1c540 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
1c550 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
1c560 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
1c570 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
1c580 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
1c590 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
1c5a0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
1c5b0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1c5c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1c5d0 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
1c5e0 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
1c5f0 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
1c600 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
1c610 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
1c620 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
1c630 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
1c640 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
1c650 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
1c660 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
1c670 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
1c680 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1c690 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
1c6a0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
1c6b0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
1c6c0 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
1c6d0 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
1c6e0 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
1c6f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1c700 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
1c710 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1c720 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
1c730 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
1c740 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1c750 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
1c760 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
1c770 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c780 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
1c790 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
1c7a0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1c7d0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
1c7e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c7f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1c800 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
1c810 53 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d  Schema(pBt->db)=
1c820 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
1c830 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
1c840 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1c850 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1c860 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1c870 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1c880 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1c890 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
1c8a0 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
1c8b0 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
1c8c0 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
1c8d0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
1c8e0 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
1c8f0 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
1c900 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
1c910 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
1c920 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
1c930 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
1c940 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
1c950 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
1c960 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1c970 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1c980 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
1c990 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1c9a0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
1c9b0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1c9c0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1c9d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1c9e0 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
1c9f0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1ca00 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
1ca10 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
1ca20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
1ca30 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1ca40 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
1ca50 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1ca60 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
1ca70 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1ca80 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
1ca90 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
1caa0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
1cab0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
1cac0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
1cad0 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
1cae0 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
1caf0 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
1cb00 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
1cb10 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
1cb20 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
1cb30 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
1cb40 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
1cb50 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
1cb60 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
1cb70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
1cb80 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
1cb90 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
1cba0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
1cbb0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
1cbc0 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
1cbd0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1cbe0 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
1cbf0 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
1cc00 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
1cc10 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
1cc20 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
1cc30 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
1cc40 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
1cc50 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
1cc60 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
1cc70 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
1cc80 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
1cc90 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
1cca0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
1ccb0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
1ccc0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1ccd0 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
1cce0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
1ccf0 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
1cd00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1cd10 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1cd20 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
1cd30 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
1cd40 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
1cd50 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
1cd60 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1cd70 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1cd80 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
1cd90 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
1cda0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
1cdb0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1cdc0 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
1cdd0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1cde0 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
1cdf0 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
1ce00 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
1ce10 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
1ce20 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
1ce30 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
1ce40 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
1ce50 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1ce60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ce70 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
1ce80 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
1ce90 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1cea0 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1ceb0 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1cec0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1ced0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1cee0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1cef0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1cf00 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1cf10 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1cf20 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1cf30 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1cf40 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1cf50 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1cf60 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1cf70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1cf80 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1cf90 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1cfa0 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1cfb0 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1cfc0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1cfd0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1cfe0 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1cff0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1d000 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1d010 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1d020 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1d030 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1d040 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1d050 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1d060 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1d070 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1d080 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1d090 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1d0a0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1d0b0 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1d0c0 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1d0d0 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1d0e0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1d0f0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1d100 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1d110 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1d120 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1d130 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1d140 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1d150 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1d160 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1d170 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1d180 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1d190 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1d1a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1d1b0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1d1c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1d1d0 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1d1e0 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1d1f0 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1d200 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1d210 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1d220 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1d230 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1d240 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1d250 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1d260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1d270 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1d280 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1d290 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1d2a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1d2b0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1d2c0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1d2d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d2e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1d2f0 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1d300 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1d310 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1d320 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d330 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d340 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d350 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1d360 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1d370 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d380 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1d390 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1d3a0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1d3b0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1d3c0 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1d3d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1d3e0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1d3f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d400 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1d410 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d420 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1d430 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1d440 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1d450 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1d460 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1d470 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1d480 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
1d490 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
1d4a0 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
1d4b0 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
1d4c0 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
1d4d0 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
1d4e0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
1d4f0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
1d500 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1d510 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
1d520 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
1d530 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
1d540 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
1d550 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
1d560 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1d570 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d580 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1d590 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
1d5a0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
1d5b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d5c0 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
1d5d0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
1d5e0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
1d5f0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
1d600 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1d610 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
1d620 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1d630 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1d640 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
1d650 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
1d660 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1d670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
1d680 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1d690 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
1d6a0 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
1d6b0 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
1d6c0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
1d6d0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1d6e0 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
1d6f0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
1d700 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
1d710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1d720 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
1d730 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
1d740 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
1d750 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
1d760 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
1d770 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
1d780 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
1d790 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
1d7a0 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
1d7b0 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
1d7c0 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
1d7d0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
1d7e0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
1d7f0 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
1d800 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
1d810 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
1d820 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1d830 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1d840 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
1d850 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d860 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
1d870 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
1d880 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
1d890 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
1d8a0 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
1d8b0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
1d8c0 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
1d8d0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
1d8e0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
1d8f0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1d900 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1d910 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
1d920 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
1d930 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
1d940 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
1d950 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1d960 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d970 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1d980 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1d990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d9a0 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
1d9b0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
1d9c0 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1d9d0 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
1d9e0 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
1d9f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1da00 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1da10 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1da20 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1da30 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1da40 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
1da50 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1da60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1da70 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
1da80 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1da90 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1daa0 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
1dab0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1dac0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1dad0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1dae0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
1daf0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
1db00 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
1db10 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
1db20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1db30 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1db40 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1db50 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1db60 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1db70 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1db80 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1db90 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1dba0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1dbb0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1dbc0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1dbd0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1dbe0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1dbf0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1dc00 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1dc10 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1dc20 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1dc30 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1dc40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1dc50 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1dc60 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1dc70 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1dc80 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1dc90 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1dca0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1dcb0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1dcc0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1dcd0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1dce0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1dcf0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1dd00 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1dd10 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1dd20 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1dd30 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1dd40 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1dd50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1dd60 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1dd70 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1dd80 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1dd90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1dda0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1ddb0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1ddc0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1ddd0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1dde0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1ddf0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1de00 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1de10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1de20 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1de30 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1de40 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1de50 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1de60 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1de70 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1de80 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1de90 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1dea0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1deb0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1dec0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1ded0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1dee0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1def0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1df00 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1df10 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1df20 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1df30 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1df40 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1df50 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1df60 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1df70 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1df80 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1df90 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1dfa0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1dfb0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1dfc0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1dfd0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1dfe0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1dff0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1e000 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1e010 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1e020 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1e030 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1e040 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1e050 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1e060 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1e070 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1e080 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1e090 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1e0a0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1e0b0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1e0c0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1e0d0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1e0e0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1e0f0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1e100 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1e110 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1e120 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1e130 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1e140 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1e150 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1e160 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1e170 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1e180 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1e190 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a  nt wrflag, int *
1e1a0 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b  pSchemaVersion){
1e1b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1e1c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1e1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e1e0 0a 20 20 69 6e 74 20 62 43 6f 6e 63 75 72 72 65  .  int bConcurre
1e1f0 6e 74 20 3d 20 28 70 2d 3e 64 62 2d 3e 62 43 6f  nt = (p->db->bCo
1e200 6e 63 75 72 72 65 6e 74 20 26 26 20 21 49 53 41  ncurrent && !ISA
1e210 55 54 4f 56 41 43 55 55 4d 29 3b 0a 0a 20 20 73  UTOVACUUM);..  s
1e220 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e230 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1e240 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1e250 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1e260 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1e270 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1e280 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1e290 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1e2a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1e2b0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1e2c0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1e2d0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1e2e0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1e2f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1e300 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1e310 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e320 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1e330 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1e340 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1e350 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1e360 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e370 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1e380 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1e390 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1e3a0 20 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c    if( (p->db->fl
1e3b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73  ags & SQLITE_Res
1e3c0 65 74 44 61 74 61 62 61 73 65 29 20 0a 20 20 20  etDatabase) .   
1e3d0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  && sqlite3PagerI
1e3e0 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
1e3f0 50 61 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a  Pager)==0 .  ){.
1e400 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1e410 73 20 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f  s &= ~BTS_READ_O
1e420 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  NLY;.  }..  /* W
1e430 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1e440 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
1e450 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
1e460 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
1e470 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1e480 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1e490 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67  LY)!=0 && wrflag
1e4a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1e4b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1e4c0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1e4d0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
1e4e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1e4f0 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20  RED_CACHE.  {.  
1e500 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
1e510 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66  k = 0;.    /* If
1e520 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
1e530 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
1e540 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
1e550 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1e560 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  .    ** on this 
1e570 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
1e580 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
1e590 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
1e5a0 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20  ction is.    ** 
1e5b0 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
1e5c0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
1e5d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e5e0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
1e5f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1e600 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20  RANS_WRITE).    
1e610 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
1e620 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
1e630 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1e640 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
1e650 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20  pWriter->db;.   
1e660 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
1e670 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c  g>1 ){.      BtL
1e680 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
1e690 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
1e6a0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
1e6b0 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
1e6c0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
1e6d0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
1e6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42   ){.          pB
1e6f0 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
1e700 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
1e710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e720 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e730 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63   }.    if( pBloc
1e740 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
1e750 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1e760 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
1e770 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  k);.      rc = S
1e780 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1e790 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20  REDCACHE;.      
1e7a0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1e7b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1e7c0 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
1e7d0 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
1e7e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1e7f0 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
1e800 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
1e810 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
1e820 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
1e830 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
1e840 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
1e850 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
1e860 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
1e870 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
1e880 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
1e890 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
1e8a0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
1e8b0 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
1e8c0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
1e8d0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
1e8e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
1e8f0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1e900 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c  &= ~BTS_INITIALL
1e910 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70  Y_EMPTY;.  if( p
1e920 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70  Bt->nPage==0 ) p
1e930 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1e940 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1e950 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  PTY;.  do {.    
1e960 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
1e970 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
1e980 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
1e990 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
1e9a0 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
1e9b0 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
1e9c0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
1e9d0 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
1e9e0 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
1e9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ea00 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
1ea10 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
1ea20 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
1ea30 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
1ea40 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
1ea50 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1ea60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
1ea70 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
1ea80 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
1ea90 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
1eaa0 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
1eab0 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
1eac0 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
1ead0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1eae0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1eaf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
1eb00 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
1eb10 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
1eb20 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
1eb30 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
1eb40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eb50 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1eb60 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73     if( (pBt->bts
1eb70 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1eb80 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
1eb90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1eba0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
1ebb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ebc0 69 6e 74 20 65 78 46 6c 61 67 20 3d 20 62 43 6f  int exFlag = bCo
1ebd0 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31 20 3a 20  ncurrent ? -1 : 
1ebe0 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20  (wrflag>1);.    
1ebf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ec00 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
1ec10 70 50 61 67 65 72 2c 20 65 78 46 6c 61 67 2c 20  pPager, exFlag, 
1ec20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
1ec30 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
1ec40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ec50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ec60 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1ec70 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1ec80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1ec90 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41  =SQLITE_BUSY_SNA
1eca0 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e 69 6e  PSHOT && pBt->in
1ecb0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ecc0 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1ecd0 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65       /* if there
1ece0 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61 63 74   was no transact
1ecf0 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65 6e 20  ion opened when 
1ed00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
1ed10 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
1ed20 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49 54 45  alled and SQLITE
1ed30 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 69  _BUSY_SNAPSHOT i
1ed40 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68 61 6e  s returned, chan
1ed50 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  ge the error.   
1ed60 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 74         ** code t
1ed70 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a  o SQLITE_BUSY. *
1ed80 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1ed90 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1eda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1edb0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1edc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1edd0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1ede0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1edf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1ee00 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1ee10 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1ee20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ee30 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1ee40 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1ee50 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1ee60 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  Bt) );.  sqlite3
1ee70 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69  PagerResetLockTi
1ee80 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65  meout(pBt->pPage
1ee90 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  r);..  if( rc==S
1eea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eeb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1eec0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1eed0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1eee0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
1eef0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1ef00 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1ef10 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
1ef20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1ef30 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
1ef40 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
1ef50 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
1ef60 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
1ef70 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
1ef80 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1ef90 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1efa0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
1efb0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
1efc0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1efd0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
1efe0 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
1eff0 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
1f000 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
1f010 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
1f020 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1f030 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
1f040 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
1f050 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
1f060 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1f070 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
1f080 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1f090 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
1f0a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1f0b0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
1f0c0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
1f0d0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
1f0e0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
1f0f0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1f100 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
1f110 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
1f120 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
1f130 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1f140 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
1f150 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
1f160 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
1f170 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
1f180 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
1f190 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
1f1a0 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
1f1b0 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
1f1c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1f1d0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
1f1e0 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
1f1f0 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
1f200 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
1f210 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1f220 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
1f230 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
1f240 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1f250 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
1f260 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
1f270 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
1f280 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
1f290 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1f2a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1f2b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f2c0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
1f2d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1f2e0 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
1f2f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f300 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1f310 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1f320 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f340 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f350 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1f360 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1f370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f380 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72   }.    }.  }..tr
1f390 61 6e 73 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64  ans_begun:.#ifnd
1f3a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1f3b0 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20  ONCURRENT.  if( 
1f3c0 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 72  bConcurrent && r
1f3d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f3e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 57 61  sqlite3PagerIsWa
1f3f0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  l(pBt->pPager) )
1f400 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1f410 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63  e3PagerBeginConc
1f420 75 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67  urrent(pBt->pPag
1f430 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1f440 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1f450 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63  flag ){.      rc
1f460 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c   = btreePtrmapAl
1f470 6c 6f 63 61 74 65 28 70 42 74 29 3b 0a 20 20 20  locate(pBt);.   
1f480 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1f490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f4a0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1f4b0 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a  chemaVersion ){.
1f4c0 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65        *pSchemaVe
1f4d0 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65  rsion = get4byte
1f4e0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f4f0 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d  Data[40]);.    }
1f500 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1f510 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1f520 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1f530 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1f540 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1f550 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
1f560 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1f570 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1f580 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1f590 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1f5a0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  d.      ** the s
1f5b0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
1f5c0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
1f5d0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
1f5e0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
1f5f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1f600 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  nSavepoint = p->
1f610 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  db->nSavepoint;.
1f620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f630 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1f640 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1f650 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , nSavepoint);. 
1f660 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f670 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70  ITE_OK && nSavep
1f680 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
1f690 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  rc = btreePtrmap
1f6a0 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61 76 65  Begin(pBt, nSave
1f6b0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
1f6c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72      }.  }..  btr
1f6d0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1f6e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f6f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f700 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1f710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1f720 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
1f730 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
1f740 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1f750 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
1f760 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
1f770 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
1f780 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
1f790 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1f7a0 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
1f7b0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
1f7c0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
1f7d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1f7e0 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
1f7f0 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
1f800 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
1f810 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1f840 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
1f850 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f880 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
1f890 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
1f8a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8c0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f8d0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1f8e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1f8f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1f900 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
1f910 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f920 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1f930 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1f940 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73    rc = pPage->is
1f950 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Init ? SQLITE_OK
1f960 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   : btreeInitPage
1f970 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1f980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f990 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c  eturn rc;.  nCel
1f9a0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1f9b0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1f9c0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1f9d0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1f9e0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1f9f0 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
1fa00 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 50  vflPtr(pPage, pP
1fa10 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1fa20 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1fa30 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1fa40 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1fa50 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1fa60 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1fa70 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1fa80 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1fa90 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1faa0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1fab0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1fac0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1fad0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1fae0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1faf0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1fb00 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1fb10 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1fb20 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1fb30 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  , &rc);.  }..  r
1fb40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fb50 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1fb60 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1fb70 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1fb80 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1fb90 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1fba0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1fbb0 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1fbc0 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1fbd0 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1fbe0 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1fbf0 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1fc00 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1fc10 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1fc20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1fc30 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1fc40 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1fc50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1fc60 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1fc70 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1fc80 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1fc90 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1fca0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1fcb0 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1fcc0 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1fcd0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1fce0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1fcf0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1fd00 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1fd10 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1fd20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1fd30 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1fd40 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1fd50 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1fd70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1fd80 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1fd90 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1fda0 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1fdb0 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1fdc0 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1fdd0 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1fde0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1fdf0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1fe00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1fe10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1fe20 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1fe30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1fe40 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1fe50 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1fe60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1fe70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1fe80 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1fe90 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1fea0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1feb0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1fec0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1fed0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1fee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1fef0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1ff00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1ff10 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1ff20 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1ff30 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1ff40 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1ff50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1ff60 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1ff70 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1ff80 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1ff90 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1ffa0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1ffb0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1ffc0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1ffd0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1ffe0 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1fff0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
20000 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
20010 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
20020 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
20030 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
20040 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
20050 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
20060 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
20070 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
20080 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
20090 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
200a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
200b0 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
200c0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
200d0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
200e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
200f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20100 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
20110 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20120 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
20130 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
20140 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
20150 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
20160 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
20170 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
20180 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
20190 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
201a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
201b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
201c0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
201d0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
201e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
201f0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
20200 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
20210 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
20220 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
20230 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
20240 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
20250 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
20260 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
20270 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
20280 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
20290 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
202a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
202b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
202c0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
202d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
202e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
202f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
20300 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
20310 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20320 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20330 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
20340 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
20350 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
20360 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
20370 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
20380 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
20390 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
203a0 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
203b0 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
203c0 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
203d0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
203e0 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
203f0 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
20400 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
20410 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
20420 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
20430 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
20440 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
20450 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
20460 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
20470 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
20480 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
20490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
204a0 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
204b0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
204c0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
204d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
204e0 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
204f0 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
20500 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
20510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20520 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
20530 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
20540 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
20550 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
20560 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
20570 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
20580 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
20590 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
205a0 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
205b0 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
205c0 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
205d0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
205e0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
205f0 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
20600 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
20610 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
20620 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
20630 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
20640 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
20650 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
20660 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
20670 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
20680 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
20690 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
206a0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
206b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
206c0 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
206d0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
206e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
206f0 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
20700 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
20710 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
20720 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
20730 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20740 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20750 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20760 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
20770 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 69  >pBt==pBt );.  i
20780 66 28 20 69 44 62 50 61 67 65 3c 33 20 29 20 72  f( iDbPage<3 ) r
20790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
207a0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
207b0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
207c0 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
207d0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
207e0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
207f0 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
20800 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
20810 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
20820 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
20830 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
20840 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
20850 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
20860 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
20870 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
20880 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
20890 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
208a0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
208b0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
208c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
208d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
208e0 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
208f0 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
20900 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
20910 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
20920 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
20930 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
20940 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
20950 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
20960 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
20970 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
20980 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
20990 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
209a0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
209b0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
209c0 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
209d0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
209e0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
209f0 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
20a00 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
20a10 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
20a20 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
20a30 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
20a40 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
20a50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
20a60 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
20a70 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
20a80 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
20a90 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
20aa0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
20ab0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
20ac0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
20ad0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
20ae0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
20af0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20b10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20b20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20b30 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
20b40 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
20b50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
20b60 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
20b70 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
20b80 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
20b90 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
20ba0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
20bb0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
20bc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20bd0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20be0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
20bf0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
20c00 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
20c10 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
20c20 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
20c30 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
20c40 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
20c50 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
20c60 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
20c70 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
20c80 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
20c90 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
20ca0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
20cb0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
20cc0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
20cd0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
20ce0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
20cf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
20d10 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
20d20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20d30 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
20d40 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
20d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
20d70 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
20d80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20d90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
20da0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
20db0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
20dc0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
20dd0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
20de0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
20df0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20e00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20e10 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
20e20 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
20e30 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
20e40 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
20e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20e60 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
20e70 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
20e80 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
20e90 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
20ea0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
20eb0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
20ec0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
20ed0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
20ee0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
20ef0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
20f00 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
20f10 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
20f20 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
20f30 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
20f40 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
20f50 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
20f60 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
20f70 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
20f80 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
20f90 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
20fa0 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
20fb0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
20fc0 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
20fd0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
20fe0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
20ff0 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
21000 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
21010 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
21020 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
21030 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
21040 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
21050 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
21060 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
21070 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
21080 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
21090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
210a0 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
210b0 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
210c0 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
210d0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
210e0 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
210f0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
21100 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
21110 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
21120 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
21130 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
21140 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
21150 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
21160 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
21170 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
21180 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
21190 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
211a0 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
211b0 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
211c0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
211d0 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
211e0 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
211f0 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
21200 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
21210 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
21220 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
21230 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
21240 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
21250 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
21260 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
21270 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
21280 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
21290 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
212a0 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
212b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
212c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
212d0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
212e0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
212f0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
21300 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
21310 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
21320 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
21330 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21340 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
21350 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
21360 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
21370 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
21380 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
21390 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
213a0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
213b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
213c0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
213d0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
213e0 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
213f0 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
21400 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
21410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
21430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21440 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
21450 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
21460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21470 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
21480 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
21490 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
214a0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
214b0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
214c0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
214d0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
214e0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
214f0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
21500 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
21510 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
21520 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
21530 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
21540 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
21550 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
21560 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
21570 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21580 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
21590 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
215a0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
215b0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
215c0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
215d0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
215e0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
215f0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
21600 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
21610 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
21620 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
21630 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
21640 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
21650 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
21660 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21680 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
21690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
216a0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
216b0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
216c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
216d0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
216e0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
216f0 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
21700 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
21710 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
21720 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
21730 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
21740 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
21750 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
21760 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
21770 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
21780 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
21790 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
217a0 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
217b0 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
217c0 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
217d0 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
217e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
217f0 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
21800 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
21810 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
21820 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
21830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21840 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21850 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
21860 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
21870 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
21880 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
21890 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
218a0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
218b0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
218c0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
218d0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
218e0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
218f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21900 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
21910 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
21920 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
21930 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
21940 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
21950 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
21960 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
21970 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
21980 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
21990 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
219a0 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
219b0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
219c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
219d0 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
219e0 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
219f0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
21a00 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
21a10 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
21a20 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
21a30 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
21a40 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
21a50 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
21a60 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
21a70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21a80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21a90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21aa0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
21ab0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ad0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
21ae0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
21af0 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
21b00 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
21b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
21b20 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
21b30 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
21b40 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
21b50 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
21b60 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
21b70 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
21b80 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
21b90 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
21ba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
21be0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
21bf0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
21c00 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
21c10 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
21c20 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
21c30 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
21c40 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
21c50 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
21c60 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
21c70 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
21c80 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
21c90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
21ca0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21cb0 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
21cc0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
21cd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
21ce0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
21cf0 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
21d00 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
21d10 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
21d20 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
21d30 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
21d40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
21d50 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
21d60 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
21d70 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
21d80 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
21d90 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
21da0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
21db0 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
21dc0 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
21dd0 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
21de0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21df0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
21e00 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
21e10 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
21e20 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
21e30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21e40 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
21e50 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
21e60 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e80 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
21e90 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
21ea0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
21eb0 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
21ec0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
21ed0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
21ee0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
21ef0 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
21f00 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
21f10 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
21f20 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
21f30 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
21f40 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
21f50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
21f60 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
21f70 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
21f80 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
21f90 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
21fa0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
21fb0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
21fc0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
21fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
21fe0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
21ff0 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
22000 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
22010 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
22020 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
22030 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
22040 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
22050 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
22060 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
22070 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
22080 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
22090 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
220a0 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
220b0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
220c0 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
220d0 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
220e0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
220f0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
22100 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
22110 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
22120 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
22130 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22140 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
22150 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
22160 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22170 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
22180 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
221a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
221b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
221c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
221d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
221e0 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
221f0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
22200 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
22210 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
22220 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
22230 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
22240 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
22250 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
22260 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
22270 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
22280 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
22290 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
222a0 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
222b0 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
222c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
222d0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
222e0 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
222f0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
22300 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
22310 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
22320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22330 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
22340 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
22350 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
22360 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
22370 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
22380 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
22390 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
223a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
223b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
223c0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
223d0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
223e0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
223f0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
22400 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
22410 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
22420 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
22430 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
22440 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
22450 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22460 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
22470 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
22480 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
22490 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
224a0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
224b0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
224c0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
224d0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
224e0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
224f0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
22500 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
22510 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
22520 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
22530 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
22540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22550 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
22560 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
22570 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
22580 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
22590 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
225a0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
225b0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
225c0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
225d0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
225e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
225f0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
22600 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
22610 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22620 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
22630 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
22640 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
22650 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
22660 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
22670 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
22680 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22690 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
226a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
226b0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
226c0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
226d0 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
226e0 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
226f0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
22700 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
22710 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
22720 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
22730 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
22740 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
22750 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
22760 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22770 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
22780 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
22790 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
227a0 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
227b0 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
227c0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
227d0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
227e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
227f0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
22800 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
22810 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
22820 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
22830 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
22840 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
22850 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
22860 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
22870 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
22880 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
22890 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
228a0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
228b0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
228c0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
228d0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
228e0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
228f0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
22900 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
22910 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
22920 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
22930 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
22940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22950 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22960 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
22970 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
22980 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
22990 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
229a0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
229b0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
229c0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
229d0 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
229e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
229f0 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
22a00 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
22a10 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
22a20 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
22a30 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
22a40 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
22a50 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
22a60 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
22a70 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
22a80 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
22a90 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
22aa0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
22ab0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
22ac0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
22ad0 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
22ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22af0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
22b00 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
22b10 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
22b20 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
22b30 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
22b40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
22b50 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
22b60 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
22b70 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
22b80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
22b90 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
22ba0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
22bb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
22bc0 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
22bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
22be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22bf0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
22c00 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
22c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
22c20 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
22c30 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
22c40 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
22c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
22c60 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
22c70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
22c80 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
22c90 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
22ca0 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
22cb0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
22cc0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
22cd0 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ENT./*.** This f
22ce0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22cf0 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72  d as part of mer
22d00 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45  ging an CONCURRE
22d10 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  NT transaction w
22d20 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73  ith.** the snaps
22d30 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64 20  hot at the head 
22d40 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e  of the wal file.
22d50 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c   It relocates al
22d60 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a  l pages in the.*
22d70 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e  * range iFirst..
22d80 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65  iLast, inclusive
22d90 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
22da0 74 68 61 74 20 74 68 65 20 42 74 72 65 65 50 74  that the BtreePt
22db0 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75  rmap .** structu
22dc0 72 65 20 61 74 20 42 74 53 68 61 72 65 64 2e 70  re at BtShared.p
22dd0 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  Map contains the
22de0 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
22df0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63   pointers to eac
22e00 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65  h.** page in the
22e10 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   range..**.** If
22e20 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55   pnCurrent is NU
22e30 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  LL, then all pag
22e40 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20  es in the range 
22e50 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72  are moved to cur
22e60 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c  rently.** free l
22e70 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66  ocations (i.e. f
22e80 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73  ree-list entries
22e90 29 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74  ) within the dat
22ea0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
22eb0 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74  e page.** iFirst
22ec0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70  ..**.** Or, if p
22ed0 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20  nCurrent is not 
22ee0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f  NULL, then it po
22ef0 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20  ints to a value 
22f00 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
22f10 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * current size o
22f20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22f30 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e  ile in pages. In
22f40 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20   this case, all 
22f50 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c  pages are.** rel
22f60 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e  ocated to the en
22f70 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
22f80 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46  e file - page iF
22f90 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65  irst is relocate
22fa0 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70  d to.** page (*p
22fb0 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67  nCurrent+1), pag
22fc0 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61  e iFirst+1 to pa
22fd0 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32  ge (*pnCurrent+2
22fe0 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a  ), and so on..**
22ff0 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e   Value *pnCurren
23000 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
23010 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
23020 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
23030 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
23040 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
23050 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
23060 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
23070 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
23080 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
23090 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
230a0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
230b0 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20  RelocateRange(. 
230c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c   /* B-tree handl
230f0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72  e */.  Pgno iFir
23100 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
23110 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23120 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65  page to relocate
23130 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74   */.  Pgno iLast
23140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23150 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
23160 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
23170 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72  /.  Pgno *pnCurr
23180 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ent             
23190 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
231a0 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61  LL, IN/OUT: Data
231b0 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  base size */.){.
231c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
231d0 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72  E_OK;.  BtreePtr
231e0 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
231f0 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50  >pMap;.  Pgno iP
23200 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46  g;..  for(iPg=iF
23210 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74  irst; iPg<=iLast
23220 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
23230 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d  K; iPg++){.    M
23240 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20  emPage *pFree = 
23250 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61  0;     /* Page a
23260 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72  llocated from fr
23270 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d  ee-list */.    M
23280 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
23290 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20  .    Pgno iNew; 
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
232b0 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  New page number 
232c0 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50  for pPg */.    P
232d0 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
232e0 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ry;    /* Pointe
232f0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
23300 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20  page iPg */..   
23310 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e   if( iPg==PENDIN
23320 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
23330 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23340 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d   pEntry = &pMap-
23350 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70  >aPtr[iPg - pMap
23360 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20  ->iFirst];..    
23370 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  if( pEntry->eTyp
23380 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
23390 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  GE ){.      Pgno
233a0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63   dummy;.      rc
233b0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
233c0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
233d0 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42  , &dummy, iPg, B
233e0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
233f0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
23400 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
23410 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
23420 67 65 52 65 66 63 6f 75 6e 74 28 70 46 72 65 65  geRefcount(pFree
23430 2d 3e 70 44 62 50 61 67 65 29 3d 3d 31 20 29 3b  ->pDbPage)==1 );
23440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23450 50 63 61 63 68 65 44 72 6f 70 28 70 46 72 65 65  PcacheDrop(pFree
23460 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
23470 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23490 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67 20 29 3b  || dummy==iPg );
234a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
234b0 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20  nCurrent ){.    
234c0 20 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70    btreeGetPage(p
234d0 42 74 2c 20 69 50 67 2c 20 26 70 50 67 2c 20 30  Bt, iPg, &pPg, 0
234e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
234f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
23500 72 69 74 65 61 62 6c 65 28 70 50 67 2d 3e 70 44  riteable(pPg->pD
23510 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
23520 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
23530 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
23540 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3d 3d  (pPg->pDbPage)==
23550 31 20 29 3b 0a 20 20 20 20 20 20 69 4e 65 77 20  1 );.      iNew 
23560 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29  = ++(*pnCurrent)
23570 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4e 65 77  ;.      if( iNew
23580 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
23590 41 47 45 28 70 42 74 29 20 29 20 69 4e 65 77 20  AGE(pBt) ) iNew 
235a0 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e 74 29  = ++(*pnCurrent)
235b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  ;.      rc = rel
235c0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
235d0 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
235e0 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
235f0 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a 20 20 20  t, iNew, 1);.   
23600 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
23610 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20  tNull(pPg);.    
23620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
23630 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
23640 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c  age(pBt, &pFree,
23650 20 26 69 4e 65 77 2c 20 69 46 69 72 73 74 2d 31   &iNew, iFirst-1
23660 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29 3b 0a 20  , BTALLOC_LE);. 
23670 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
23680 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e  =SQLITE_OK || iN
23690 65 77 3c 69 46 69 72 73 74 20 29 3b 0a 20 20 20  ew<iFirst );.   
236a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
236b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
236c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
236d0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  e);.        btre
236e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
236f0 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
23700 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
23710 74 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c  tePage(pBt, pPg,
23720 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20   pEntry->eType, 
23730 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69  pEntry->parent,i
23740 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  New,1);.        
23750 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
23760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23780 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
23790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
237a0 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68  URRENT).**.** Th
237b0 65 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  e b-tree handle 
237c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
237d0 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
237e0 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61  bout to commit a
237f0 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20  n.** CONCURRENT 
23800 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20  transaction. At 
23810 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
23820 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
23830 20 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73   this is .** pos
23840 73 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20  sible - the wal 
23850 57 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68  WRITER lock is h
23860 65 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e  eld and it is kn
23870 6f 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61  own that there a
23880 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69  re .** no confli
23890 63 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74  cts with committ
238a0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
238b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
238c0 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28  treeFixUnlocked(
238d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
238e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
238f0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
23900 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
23910 61 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d  age1;.  u8 *p1 =
23920 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
23930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23940 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
23950 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23960 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61  _OK;..  /* If pa
23970 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
23980 62 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74  base is not writ
23990 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61  able, then no pa
239a0 67 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74  ges were allocat
239b0 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64  ed.  ** or freed
239c0 20 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63   by this transac
239d0 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
239e0 73 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61  se no special ha
239f0 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20  ndling is .  ** 
23a00 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
23a10 69 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69  ise, if page 1 i
23a20 73 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64  s dirty, proceed
23a30 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72  .  */.  BtreePtr
23a40 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
23a50 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54  >pMap;.  Pgno iT
23a60 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
23a70 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f  &p1[32]);.  Pgno
23a80 20 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   nPage = btreePa
23a90 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
23aa0 75 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34  u32 nFree = get4
23ab0 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
23ac0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
23ad0 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Map );.  rc = sq
23ae0 6c 69 74 65 33 50 61 67 65 72 55 70 67 72 61 64  lite3PagerUpgrad
23af0 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72  eSnapshot(pPager
23b00 2c 20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  , pPage1->pDbPag
23b10 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31  e);.  assert( p1
23b20 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ==pPage1->aData 
23b30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
23b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
23b50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67 65 74  gno nHPage = get
23b60 34 62 79 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a  4byte(&p1[28]);.
23b70 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
23b80 6e 48 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  nHPage;         
23b90 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 61 66  /* Size of db af
23ba0 74 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ter transaction 
23bb0 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66  merge */..    if
23bc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
23bd0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
23be0 2d 3e 70 44 62 50 61 67 65 29 20 29 7b 0a 20 20  ->pDbPage) ){.  
23bf0 20 20 20 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b      Pgno iHTrunk
23c00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
23c10 33 32 5d 29 3b 0a 20 20 20 20 20 20 75 33 32 20  32]);.      u32 
23c20 6e 48 46 72 65 65 20 3d 20 67 65 74 34 62 79 74  nHFree = get4byt
23c30 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20  e(&p1[36]);..   
23c40 20 20 20 62 74 72 65 65 50 74 72 6d 61 70 43 68     btreePtrmapCh
23c50 65 63 6b 28 70 42 74 2c 20 6e 50 61 67 65 29 3b  eck(pBt, nPage);
23c60 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63  ..      /* Attac
23c70 68 20 74 68 65 20 68 65 61 64 20 64 61 74 61 62  h the head datab
23c80 61 73 65 20 66 72 65 65 20 6c 69 73 74 20 74 6f  ase free list to
23c90 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23ca0 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  current.      **
23cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 66 72   transactions fr
23cc0 65 65 2d 6c 69 73 74 20 28 69 66 20 61 6e 79 29  ee-list (if any)
23cd0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
23ce0 69 54 72 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20  iTrunk!=0 ){.   
23cf0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
23d00 31 5b 33 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20  1[36], nHFree + 
23d10 6e 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  nFree);.        
23d20 70 75 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d  put4byte(&p1[32]
23d30 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  , iTrunk);.     
23d40 20 20 20 77 68 69 6c 65 28 20 69 54 72 75 6e 6b     while( iTrunk
23d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62   ){.          Db
23d60 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73  Page *pTrunk = s
23d70 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
23d80 70 28 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b  p(pPager, iTrunk
23d90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 72  );.          iTr
23da0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 28  unk = get4byte((
23db0 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74  u8*)pTrunk->pDat
23dc0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
23dd0 28 20 69 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20  ( iTrunk==0 ){. 
23de0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
23df0 79 74 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d  yte((u8*)pTrunk-
23e00 3e 70 44 61 74 61 2c 20 69 48 54 72 75 6e 6b 29  >pData, iHTrunk)
23e10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
23e30 61 67 65 72 55 6e 72 65 66 28 70 54 72 75 6e 6b  agerUnref(pTrunk
23e40 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  );.        };.  
23e50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
23e60 20 6e 48 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69   nHPage<(pMap->i
23e70 46 69 72 73 74 2d 31 29 20 29 7b 0a 20 20 20 20  First-1) ){.    
23e80 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23e90 61 73 65 20 63 6f 6e 73 69 73 74 65 64 20 6f 66  ase consisted of
23ea0 20 28 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31   (pMap->iFirst-1
23eb0 29 20 70 61 67 65 73 20 77 68 65 6e 20 74 68 65  ) pages when the
23ec0 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
23ed0 20 2a 2a 20 63 6f 6e 63 75 72 72 65 6e 74 20 74   ** concurrent t
23ee0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
23ef0 70 65 6e 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f  pened. And an co
23f00 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63  ncurrent transac
23f10 74 69 6f 6e 20 6d 61 79 0a 20 20 20 20 20 20 20  tion may.       
23f20 20 2a 2a 20 6e 6f 74 20 62 65 20 65 78 65 63 75   ** not be execu
23f30 74 65 64 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76  ted on an auto-v
23f40 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 20 2d  acuum database -
23f50 20 73 6f 20 74 68 65 20 64 62 20 73 68 6f 75 6c   so the db shoul
23f60 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  d .        ** no
23f70 74 20 68 61 76 65 20 73 68 72 75 6e 6b 20 73 69  t have shrunk si
23f80 6e 63 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  nce the transact
23f90 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
23fa0 54 68 65 72 65 66 6f 72 65 20 6e 48 50 61 67 65  Therefore nHPage
23fb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  .        ** shou
23fc0 6c 64 20 62 65 20 73 65 74 20 74 6f 20 28 70 4d  ld be set to (pM
23fd0 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 6f 72  ap->iFirst-1) or
23fe0 20 67 72 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20   greater. */.   
23ff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24000 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24010 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24020 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
24030 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
24040 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 73 20 70  llocated pages p
24050 4d 61 70 2d 3e 69 46 69 72 73 74 20 74 68 72 6f  Map->iFirst thro
24060 75 67 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  ugh.        ** n
24070 50 61 67 65 20 28 69 6e 63 6c 75 73 69 76 65 29  Page (inclusive)
24080 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
24090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
240a0 2e 20 4d 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20  . Meanwhile,.   
240b0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 74 72       ** other tr
240c0 61 6e 73 61 63 74 69 6f 6e 73 20 68 61 76 65 20  ansactions have 
240d0 61 6c 6c 6f 63 61 74 65 64 20 28 69 46 69 72 73  allocated (iFirs
240e0 74 2e 2e 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d  t..nHPage). So m
240f0 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ove.        ** p
24100 61 67 65 73 20 28 69 46 69 72 73 74 2e 2e 4d 49  ages (iFirst..MI
24110 4e 28 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 29  N(nPage,nHPage))
24120 20 74 6f 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e   to (MAX(nPage,n
24130 48 50 61 67 65 29 2b 31 29 2e 20 2a 2f 0a 20 20  HPage)+1). */.  
24140 20 20 20 20 20 20 50 67 6e 6f 20 69 4c 61 73 74        Pgno iLast
24150 20 3d 20 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48   = MIN(nPage, nH
24160 50 61 67 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73  Page);    /* Las
24170 74 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  t page to move *
24180 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  /.        Pgno n
24190 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
241b0 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   Current size of
241c0 20 64 62 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20   db */..        
241d0 6e 43 75 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e  nCurrent = MAX(n
241e0 50 61 67 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20  Page, nHPage);. 
241f0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
24200 65 20 3d 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20  e = nCurrent;.  
24210 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
24220 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42  RelocateRange(pB
24230 74 2c 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c  t, pMap->iFirst,
24240 20 69 4c 61 73 74 2c 20 26 6e 43 75 72 72 65 6e   iLast, &nCurren
24250 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  t);..        /* 
24260 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f  There are now no
24270 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68   collisions with
24280 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74   the snapshot at
24290 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
242a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
242b0 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 61 74  base file. So at
242c0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
242d0 6f 75 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65  ould be possible
242e0 20 74 6f 20 77 72 69 74 65 0a 20 20 20 20 20 20   to write.      
242f0 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
24300 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
24310 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73  . Before doing s
24320 6f 20 74 68 6f 75 67 68 2c 20 61 74 74 65 6d 70  o though, attemp
24330 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  t to.        ** 
24340 72 65 6c 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66  relocate some of
24350 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 74   the new pages t
24360 6f 20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73  o free locations
24370 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79   within the body
24380 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
24390 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
243a0 20 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74   (i.e. free-list
243b0 20 65 6e 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20   entries). */.  
243c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
243d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
243e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 75       assert( nCu
243f0 72 72 65 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42  rrent!=PENDING_B
24400 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
24410 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
24420 65 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65  e3PagerSetDbsize
24430 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43  (pBt->pPager, nC
24440 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  urrent);.       
24450 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
24460 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20  yte(&p1[36]);.  
24470 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e          nFin = n
24480 43 75 72 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20  Current-nFree;. 
24490 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 75           if( nCu
244a0 72 72 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59  rrent>PENDING_BY
244b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
244c0 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin<=PENDING_BY
244d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
244e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e              nFin
244f0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  --;.          }.
24500 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d            nFin =
24510 20 4d 41 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67   MAX(nFin, nHPag
24520 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
24530 20 3d 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65   = btreeRelocate
24540 52 61 6e 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b  Range(pBt, nFin+
24550 31 2c 20 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b  1, nCurrent, 0);
24560 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
24570 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31      put4byte(&p1
24580 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
24590 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
245a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62  qlite3PagerSetDb
245b0 73 69 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69  size(pPager, nFi
245c0 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
245d0 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
245e0 64 65 66 69 6e 65 20 62 74 72 65 65 46 69 78 55  define btreeFixU
245f0 6e 6c 6f 63 6b 65 64 28 58 29 20 20 53 51 4c 49  nlocked(X)  SQLI
24600 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20  TE_OK.#endif /* 
24610 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
24620 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  URRENT */../*.**
24630 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
24640 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
24650 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
24660 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
24670 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
24680 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
24690 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
246a0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
246b0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
246c0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
246d0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
246e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
246f0 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
24700 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
24710 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
24720 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
24730 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
24740 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
24750 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
24760 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
24770 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
24780 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
24790 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
247a0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
247b0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
247c0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
247d0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
247e0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
247f0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
24800 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
24810 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
24820 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
24830 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
24840 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24850 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
24860 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
24870 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
24880 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
24890 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
248a0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
248b0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
248c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
248d0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
248e0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
248f0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
24900 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
24910 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
24920 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
24930 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
24940 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
24950 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
24960 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
24970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24980 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
24990 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
249a0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
249b0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
249c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
249d0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
249e0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
249f0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
24a00 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
24a10 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
24a20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
24a30 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
24a40 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
24a50 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
24a60 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
24a70 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
24a80 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
24a90 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
24aa0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
24ab0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
24ac0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
24ad0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
24ae0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
24af0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
24b00 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
24b10 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
24b20 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
24b30 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
24b40 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
24b50 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
24b60 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
24b70 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
24b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
24b90 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
24ba0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
24bb0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
24bc0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24bd0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
24be0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
24bf0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
24c00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
24c10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
24c20 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65  nter(p);..#ifnde
24c30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24c40 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
24c50 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24c60 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
24c70 28 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d  ( ISCONCURRENT==
24c80 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
24c90 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
24ca0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
24cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24cc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24cd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
24ce0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
24cf0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
24d00 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
24d10 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
24d20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
24d30 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
24d40 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
24d50 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
24d60 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  dif.    if( rc==
24d70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 43  SQLITE_OK && ISC
24d80 4f 4e 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20  ONCURRENT ){.   
24d90 20 20 20 72 63 20 3d 20 62 74 72 65 65 46 69 78     rc = btreeFix
24da0 55 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20  Unlocked(p);.   
24db0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
24dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24dd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24de0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
24df0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
24e00 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
24e10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
24e20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
24e30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24e40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24e50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
24e60 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
24e70 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
24e80 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
24e90 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
24ea0 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
24eb0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
24ec0 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
24ed0 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
24ee0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
24ef0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
24f00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
24f10 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
24f20 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
24f30 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
24f40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24f50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24f60 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
24f70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
24f80 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
24f90 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
24fa0 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
24fb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
24fc0 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
24fd0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
24fe0 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
24ff0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
25000 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
25010 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
25020 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
25030 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
25040 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
25050 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
25060 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
25070 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
25080 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
25090 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
250a0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
250b0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
250c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
250d0 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
250e0 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
250f0 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
25100 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
25110 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
25120 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
25130 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
25140 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
25150 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
25160 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
25170 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
25180 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
25190 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
251a0 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
251b0 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
251c0 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
251d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
251e0 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
251f0 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
25200 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
25210 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
25220 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
25230 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
25240 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
25250 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
25260 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25270 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
25280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
25290 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
252a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
252b0 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
252c0 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
252d0 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
252e0 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
252f0 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
25300 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
25310 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
25320 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
25330 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
25340 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
25350 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
25360 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
25370 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74   an CONCURRENT t
25380 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65  ransaction, dele
25390 74 65 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70  te the pBt->pMap
253a0 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c   object..  ** Al
253b0 73 6f 20 63 61 6c 6c 20 50 61 67 65 72 45 6e 64  so call PagerEnd
253c0 43 6f 6e 63 75 72 72 65 6e 74 28 29 20 74 6f 20  Concurrent() to 
253d0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
253e0 70 61 67 65 72 20 68 61 73 20 64 69 73 63 61 72  pager has discar
253f0 64 65 64 0a 20 20 2a 2a 20 74 68 65 20 72 65 63  ded.  ** the rec
25400 6f 72 64 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ord of all pages
25410 20 72 65 61 64 20 77 69 74 68 69 6e 20 74 68 65   read within the
25420 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
25430 2f 0a 20 20 62 74 72 65 65 50 74 72 6d 61 70 44  /.  btreePtrmapD
25440 65 6c 65 74 65 28 70 42 74 29 3b 0a 20 20 73 71  elete(pBt);.  sq
25450 6c 69 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e  lite3PagerEndCon
25460 63 75 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61  current(pBt->pPa
25470 67 65 72 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  ger);.  btreeInt
25480 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
25490 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
254a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
254b0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
254c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
254d0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
254e0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
254f0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
25500 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
25510 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
25520 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
25530 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
25540 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
25550 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
25560 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
25570 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
25580 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
25590 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
255a0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
255b0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
255c0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
255d0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
255e0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
255f0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
25600 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
25610 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
25620 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
25630 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
25640 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
25650 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
25660 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
25670 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
25680 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
25690 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
256a0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
256b0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
256c0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
256d0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
256e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
256f0 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
25700 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
25710 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
25720 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
25730 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
25740 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
25750 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
25760 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
25770 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
25780 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
25790 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
257a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
257b0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
257c0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
257d0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
257e0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
257f0 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
25800 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
25810 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
25820 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
25830 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
25840 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
25850 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
25860 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
25870 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
25880 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
25890 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
258a0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
258b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
258c0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
258d0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
258e0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
258f0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
25900 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
25910 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
25920 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
25930 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
25940 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
25950 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
25960 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
25970 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
25980 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
25990 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
259a0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
259b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
259c0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
259d0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
259e0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
259f0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
25a00 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
25a10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
25a20 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
25a30 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
25a40 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
25a50 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
25a60 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
25a70 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
25a80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
25a90 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
25aa0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
25ab0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
25ac0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
25ad0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
25ae0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
25af0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
25b00 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
25b10 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
25b20 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
25b30 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
25b40 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
25b50 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
25b60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
25b70 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
25b80 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
25b90 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
25ba0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
25bb0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
25bc0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
25bd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
25be0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
25bf0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
25c00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25c10 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
25c20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25c30 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
25c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25c50 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
25c60 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
25c70 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
25c80 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
25c90 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
25ca0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25cb0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
25cc0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
25cd0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
25ce0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
25cf0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
25d00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
25d10 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
25d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25d30 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
25d40 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
25d50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25d60 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
25d70 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
25d80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
25d90 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
25da0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
25db0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
25dc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25dd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
25de0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
25df0 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
25e00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
25e10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
25e20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25e30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25e40 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
25e50 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
25e60 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
25e70 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
25e80 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
25e90 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
25ea0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
25eb0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
25ec0 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
25ed0 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
25ee0 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
25ef0 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
25f00 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
25f10 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
25f20 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
25f30 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
25f40 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
25f50 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
25f60 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
25f70 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
25f80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
25f90 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
25fa0 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
25fb0 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
25fc0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
25fd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
25fe0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
25ff0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
26000 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
26010 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
26020 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
26030 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
26040 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
26050 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
26060 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
26070 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
26080 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
26090 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
260a0 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
260b0 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
260c0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
260d0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
260e0 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
260f0 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
26100 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
26110 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
26120 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
26130 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
26140 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
26150 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
26160 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
26170 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
26180 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
26190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
261a0 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
261b0 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
261c0 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
261d0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
261e0 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
261f0 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
26200 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
26210 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
26220 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
26230 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
26240 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
26250 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
26260 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
26270 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
26280 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
26290 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
262a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
262b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
262c0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
262d0 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
262e0 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
262f0 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
26300 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
26310 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
26320 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
26330 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
26340 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
26350 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
26360 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
26370 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
26380 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
26390 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
263a0 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
263b0 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
263c0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
263d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
263e0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
263f0 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
26400 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
26410 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
26420 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
26430 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
26440 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
26450 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
26460 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
26470 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
26480 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
26490 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
264a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
264b0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
264c0 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
264d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
264e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
264f0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
26500 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
26510 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
26520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
26530 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
26540 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26560 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
26570 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
26580 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
26590 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
265a0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
265b0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
265c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65      }.      btre
265d0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
265e0 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d  rPages(p);.    }
265f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
26600 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
26610 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
26630 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
26640 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
26650 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
26660 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
26670 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
26680 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
26690 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
266a0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
266b0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
266c0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
266d0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
266e0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
266f0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
26700 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
26710 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
26720 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
26730 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
26740 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
26750 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
26760 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
26770 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26780 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
26790 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
267a0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
267b0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
267c0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
267d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
267e0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
267f0 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
26800 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
26810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
26820 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
26830 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
26840 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
26850 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
26860 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
26870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
26880 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
26890 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
268a0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
268b0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
268c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
268d0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
268e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
268f0 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
26900 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
26910 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
26920 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
26930 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
26940 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26950 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
26960 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
26970 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
26980 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
26990 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
269a0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
269b0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
269c0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
269d0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
269e0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
269f0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
26a00 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
26a10 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
26a20 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
26a30 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
26a40 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
26a50 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
26a60 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
26a70 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
26a80 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
26a90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
26aa0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
26ab0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
26ac0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
26ad0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
26ae0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
26af0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
26b00 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
26b10 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
26b20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
26b30 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
26b40 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
26b50 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
26b60 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
26b70 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
26b80 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
26b90 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
26ba0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
26bb0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
26bc0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
26bd0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
26be0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
26bf0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
26c00 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
26c10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
26c20 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
26c30 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
26c40 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
26c50 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
26c60 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
26c70 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
26c80 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
26c90 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
26ca0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
26cb0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26cc0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
26cd0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
26ce0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
26cf0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
26d00 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
26d10 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
26d20 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
26d30 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
26d40 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
26d50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
26d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26d70 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
26d80 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
26d90 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
26da0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
26db0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
26dc0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
26dd0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
26de0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
26df0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
26e00 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
26e10 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
26e20 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
26e30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
26e40 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
26e50 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
26e60 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
26e70 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
26e80 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
26e90 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
26ea0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
26eb0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
26ec0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
26ed0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
26ee0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
26ef0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
26f00 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
26f10 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
26f20 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
26f30 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
26f40 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
26f50 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
26f60 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
26f70 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
26f80 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
26f90 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
26fa0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
26fb0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
26fc0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
26fd0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
26fe0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
26ff0 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
27000 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
27010 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
27020 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
27030 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
27040 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
27050 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
27060 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
27070 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
27080 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
27090 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
270a0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
270b0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
270c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
270d0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
270e0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
270f0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
27100 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
27110 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
27120 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
27130 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
27140 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
27150 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27160 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
27170 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
27180 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
27190 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
271a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
271b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
271c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
271d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
271e0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
271f0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
27200 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
27210 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27220 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
27230 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
27240 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
27250 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
27260 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
27270 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
27280 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
27290 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
272a0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
272b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
272c0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
272d0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
272e0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
272f0 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
27300 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
27310 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
27320 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
27330 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
27340 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
27350 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
27360 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
27370 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
27380 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
27390 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
273a0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
273b0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
273c0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
273d0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
273e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
273f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
27400 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70  reePtrmapBegin(p
27410 42 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  Bt, iStatement);
27420 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
27430 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
27440 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27450 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
27460 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
27470 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
27480 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
27490 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
274a0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
274b0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
274c0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
274d0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
274e0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
274f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
27500 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
27510 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
27520 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
27530 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
27540 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
27550 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
27560 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
27570 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
27580 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
27590 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
275a0 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
275b0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
275c0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
275d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
275e0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
275f0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
27600 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
27610 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
27620 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
27630 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
27640 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
27650 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
27660 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
27670 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
27680 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
27690 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
276a0 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
276b0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
276c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
276d0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
276e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
276f0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
27700 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
27710 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
27720 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
27730 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
27740 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
27750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
27760 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
27770 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
27780 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
27790 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
277a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
277b0 74 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65  ter(p);.    btre
277c0 65 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20  ePtrmapEnd(pBt, 
277d0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
277e0 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
277f0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
27800 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
27810 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
27820 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
27830 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
27850 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
27860 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
27870 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
27880 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
27890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
278a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
278b0 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
278c0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
278d0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
278e0 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
278f0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
27900 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
27910 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
27920 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
27930 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
27940 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
27950 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
27960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
27970 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
27980 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
27990 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
279a0 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
279b0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
279c0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
279d0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
279e0 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
279f0 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
27a00 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
27a10 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
27a20 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
27a30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
27a40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
27a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27a60 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
27a70 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
27a80 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
27a90 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
27aa0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
27ab0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
27ac0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
27ad0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
27ae0 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
27af0 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
27b00 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
27b10 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
27b20 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
27b30 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
27b40 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
27b50 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
27b60 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
27b70 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
27b80 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
27b90 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
27ba0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54  .**.** If the BT
27bb0 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66  REE_WRCSR bit of
27bc0 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72   wrFlag is clear
27bd0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
27be0 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65  r can only.** be
27bf0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
27c00 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45  g.  If the BTREE
27c10 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65  _WRCSR bit is se
27c20 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
27c30 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  or.** can be use
27c40 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
27c50 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20   for writing if 
27c60 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
27c70 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20   for writing.** 
27c80 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
27c90 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e  hese are the con
27ca0 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
27cb0 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
27cc0 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67  r.** for writing
27cd0 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a   to be allowed:.
27ce0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
27cf0 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
27d00 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
27d10 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e  wrFlag containin
27d20 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  g BTREE_WRCSR.**
27d30 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
27d40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
27d50 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
27d60 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
27d70 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
27d80 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
27d90 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
27da0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
27db0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
27dc0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
27dd0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
27de0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
27df0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
27e00 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
27e10 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
27e20 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
27e30 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
27e40 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
27e50 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
27e60 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
27e70 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
27e80 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
27e90 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
27ea0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
27eb0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
27ec0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
27ed0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
27ee0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  n..**.** The BTR
27ef0 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74  EE_FORDELETE bit
27f00 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f   of wrFlag may o
27f10 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74  ptionally be set
27f20 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a   if BTREE_WRCSR.
27f30 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46  ** is set.  If F
27f40 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c  ORDELETE is set,
27f50 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20   that is a hint 
27f60 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
27f70 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68  ation that.** th
27f80 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f  is cursor will o
27f90 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73  nly be used to s
27fa0 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74  eek to and delet
27fb0 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20  e entries of an 
27fc0 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74  index.** as part
27fd0 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c   of a larger DEL
27fe0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ETE statement.  
27ff0 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69  The FORDELETE hi
28000 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  nt is not used b
28010 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d  y.** this implem
28020 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  entation.  But i
28030 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c  n a hypothetical
28040 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f   alternative sto
28050 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20  rage engine .** 
28060 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65  in which index e
28070 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d  ntries are autom
28080 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
28090 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64   when correspond
280a0 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77  ing table.** row
280b0 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74  s are deleted, t
280c0 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61  he FORDELETE fla
280d0 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74  g is a hint that
280e0 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45   all SEEK and DE
280f0 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  LETE.** operatio
28100 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ns on this curso
28110 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20  r can be no-ops 
28120 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65  and all READ ope
28130 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20  rations can .** 
28140 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f  return a null ro
28150 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31  w (2-bytes: 0x01
28160 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   0x00)..**.** No
28170 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
28180 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
28190 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
281a0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
281b0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
281c0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
281d0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
281e0 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
281f0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
28200 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
28210 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
28220 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
28230 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
28240 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
28250 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
28260 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
28270 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
28280 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
28290 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
282a0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
282b0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
282c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
282f0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
28320 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
28330 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
28340 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
28370 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
28380 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
28390 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
283a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
283b0 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
283c0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
283d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
283e0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
283f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
28400 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
28410 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
28420 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
28430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28440 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
28450 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
28460 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20  Cursor *pX;     
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20       /* Looping 
28490 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63  over other all c
284a0 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  ursors */..  ass
284b0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
284c0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
284d0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
284e0 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ag==0 .       ||
284f0 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57   wrFlag==BTREE_W
28500 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  RCSR .       || 
28510 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57  wrFlag==(BTREE_W
28520 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45  RCSR|BTREE_FORDE
28530 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f  LETE) .  );..  /
28540 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
28550 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
28560 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
28570 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
28580 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
28590 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
285a0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
285b0 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
285c0 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
285d0 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
285e0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
285f0 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
28600 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
28610 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
28620 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
28630 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
28640 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
28650 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
28660 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67  Info!=0, (wrFlag
28670 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65  ?2:1)) );.  asse
28680 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
28690 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
286a0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
286b0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
286c0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
286d0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
286e0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
286f0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
28700 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
28710 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
28720 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
28730 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
28740 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
28750 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
28760 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
28770 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
28780 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
28790 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
287a0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
287b0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72  ==0 );..  if( wr
287c0 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
287d0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
287e0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
287f0 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
28800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28810 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
28820 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
28830 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
28840 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
28850 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
28860 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
28870 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
28880 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
28890 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
288a0 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
288b0 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
288c0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
288d0 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
288e0 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
288f0 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
28900 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
28910 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
28920 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
28930 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
28940 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
28950 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
28960 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
28970 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
28980 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
28990 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46  ag ? BTCF_WriteF
289a0 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d  lag : 0;.  pCur-
289b0 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d  >curPagerFlags =
289c0 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41   wrFlag ? 0 : PA
289d0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
289e0 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ;.  /* If there 
289f0 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
28a00 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
28a10 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
28a20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75  all such.  ** cu
28a30 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76  rsors *must* hav
28a40 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  e the BTCF_Multi
28a50 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f  ple flag set. */
28a60 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70  .  for(pX=pBt->p
28a70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70  Cursor; pX; pX=p
28a80 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
28a90 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  f( pX->pgnoRoot=
28aa0 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b  =(Pgno)iTable ){
28ab0 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c  .      pX->curFl
28ac0 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
28ad0 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72  iple;.      pCur
28ae0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
28af0 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
28b00 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
28b10 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
28b20 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72  sor;.  pBt->pCur
28b30 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
28b40 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28b50 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
28b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28b70 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
28b80 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
28b90 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28bc0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
28bd0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
28c00 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
28c10 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
28c20 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
28c50 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
28c60 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
28c70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
28ca0 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
28cb0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ce0 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
28cf0 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
28d00 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61  nt rc;.  if( iTa
28d10 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20  ble<1 ){.    rc 
28d20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
28d30 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
28d40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
28d50 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
28d60 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
28d70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
28d80 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
28d90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
28da0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
28db0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28dc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28dd0 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
28de0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
28df0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
28e00 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
28e10 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
28e20 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
28e30 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
28e40 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
28e50 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
28e60 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
28e70 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
28e80 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
28e90 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
28ea0 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
28eb0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
28ec0 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
28ed0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
28ee0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28ef0 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
28f00 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
28f10 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
28f20 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
28f30 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
28f40 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
28f50 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
28f60 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
28f70 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
28f80 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
28f90 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
28fa0 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
28fb0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
28fc0 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
28fd0 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
28fe0 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
28ff0 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
29000 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
29010 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
29020 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
29030 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
29040 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
29050 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
29060 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
29070 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
29080 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
29090 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
290a0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
290b0 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
290c0 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54  tof(BtCursor, BT
290d0 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49  CURSOR_FIRST_UNI
290e0 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NIT));.}../*.** 
290f0 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
29100 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
29110 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
29120 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
29130 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
29140 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
29150 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
29160 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
29170 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
29180 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
29190 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
291a0 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
291b0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
291c0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
291d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
291e0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
291f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
29200 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
29210 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
29220 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
29230 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
29240 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
29250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29260 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
29270 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
29280 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
29290 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
292a0 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
292b0 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
292c0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
292d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
292e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
292f0 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
29300 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
29310 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
29320 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
29330 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
29340 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
29350 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63  pCur);.    unloc
29360 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
29370 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
29380 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
29390 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69  rflow);.    sqli
293a0 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
293b0 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
293c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
293d0 65 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ee);.    pCur->p
293e0 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
293f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29400 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
29410 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
29420 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
29430 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
29440 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
29450 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
29460 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
29470 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
29480 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
29490 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
294a0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
294b0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
294c0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
294d0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
294e0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
294f0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
29500 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
29510 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
29520 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
29530 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
29540 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e  EBUG.  static in
29550 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28  t cellInfoEqual(
29560 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c  CellInfo *a, Cel
29570 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69  lInfo *b){.    i
29580 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e  f( a->nKey!=b->n
29590 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Key ) return 0;.
295a0 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c      if( a->pPayl
295b0 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64  oad!=b->pPayload
295c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
295d0 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64   if( a->nPayload
295e0 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20  !=b->nPayload ) 
295f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
29600 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e  ( a->nLocal!=b->
29610 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20  nLocal ) return 
29620 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53  0;.    if( a->nS
29630 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20  ize!=b->nSize ) 
29640 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65  return 0;.    re
29650 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74  turn 1;.  }.  st
29660 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
29670 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
29680 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
29690 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
296a0 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
296b0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
296c0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
296d0 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
296e0 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f   pCur->ix, &info
296f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
29700 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c  ORRUPT_DB || cel
29710 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f  lInfoEqual(&info
29720 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29  , &pCur->info) )
29730 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
29740 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
29750 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
29760 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
29770 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
29780 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
29790 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
297a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
297b0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63  0 ){.    pCur->c
297c0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
297d0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
297e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
297f0 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e  ur->pPage,pCur->
29800 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  ix,&pCur->info);
29810 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
29820 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
29830 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  r);.  }.}..#ifnd
29840 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68  ef NDEBUG  /* Th
29850 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75  e next routine u
29860 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
29870 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
29880 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74  nts */./*.** Ret
29890 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
298a0 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69  given BtCursor i
298b0 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69  s valid.  A vali
298c0 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a  d cursor is one.
298d0 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ** that is curre
298e0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
298f0 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e   a row in a (non
29900 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a  -empty) table..*
29910 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69  * This is a veri
29920 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  fication routine
29930 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69   is used only wi
29940 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
29950 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
29960 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
29970 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72  sorIsValid(BtCur
29980 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
29990 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75  turn pCur && pCu
299a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
299b0 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69  R_VALID;.}.#endi
299c0 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69  f /* NDEBUG */.i
299d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
299e0 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42  ursorIsValidNN(B
299f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29a00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
29a10 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  0 );.  return pC
29a20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29a30 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
29a40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
29a50 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
29a60 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64  er key or "rowid
29a70 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74  " for a table bt
29a80 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ree..** This rou
29a90 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tine is only val
29aa0 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  id for a cursor 
29ab0 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  that is pointing
29ac0 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e   into a.** ordin
29ad0 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e  ary table btree.
29ae0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
29af0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64  points to an ind
29b00 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69  ex btree or.** i
29b10 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72  s invalid, the r
29b20 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f  esult of this ro
29b30 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e  utine is undefin
29b40 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  ed..*/.i64 sqlit
29b50 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
29b60 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
29b70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
29b80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
29b90 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29ba0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29bb0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29bc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
29bd0 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65  urIntKey );.  ge
29be0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
29bf0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
29c00 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69  info.nKey;.}..#i
29c10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
29c20 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
29c30 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  NC./*.** Return 
29c40 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
29c50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29c60 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
29c70 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61  of the.** payloa
29c80 64 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  d to which the c
29c90 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
29ca0 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  g..*/.i64 sqlite
29cb0 33 42 74 72 65 65 4f 66 66 73 65 74 28 42 74 43  3BtreeOffset(BtC
29cc0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
29cd0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29ce0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29d00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29d10 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
29d20 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
29d30 20 72 65 74 75 72 6e 20 28 69 36 34 29 70 43 75   return (i64)pCu
29d40 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  r->pBt->pageSize
29d50 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61  *((i64)pCur->pPa
29d60 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a  ge->pgno - 1) +.
29d70 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70           (i64)(p
29d80 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29d90 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65  ad - pCur->pPage
29da0 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64  ->aData);.}.#end
29db0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
29dc0 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
29dd0 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UNC */../*.** Re
29de0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
29df0 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c  of bytes of payl
29e00 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72  oad for the entr
29e10 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a  y that pCur is.*
29e20 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
29e30 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61  ting to.  For ta
29e40 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73  ble btrees, this
29e50 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f   will be the amo
29e60 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  unt.** of data. 
29e70 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65   For index btree
29e80 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
29e90 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
29ea0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
29eb0 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
29ec0 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
29ed0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
29ee0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
29ef0 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
29f00 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29f10 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
29f20 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
29f30 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
29f40 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
29f50 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
29f60 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20  R_VALID..*/.u32 
29f70 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29f80 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72  oadSize(BtCursor
29f90 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
29fa0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29fb0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
29fc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29fd0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29fe0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
29ff0 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
2a000 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  rn pCur->info.nP
2a010 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ayload;.}../*.**
2a020 20 52 65 74 75 72 6e 20 61 6e 20 75 70 70 65 72   Return an upper
2a030 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 69   bound on the si
2a040 7a 65 20 6f 66 20 61 6e 79 20 72 65 63 6f 72 64  ze of any record
2a050 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 0a 2a   for the table.*
2a060 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
2a070 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  r is pointing in
2a080 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  to..**.** This i
2a090 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2a0a0 6e 2e 20 20 45 76 65 72 79 74 68 69 6e 67 20 77  n.  Everything w
2a0b0 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ill still work i
2a0c0 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
2a0d0 65 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  e always returns
2a0e0 20 32 31 34 37 34 38 33 36 34 37 20 28 77 68 69   2147483647 (whi
2a0f0 63 68 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  ch is the larges
2a100 74 20 72 65 63 6f 72 64 0a 2a 2a 20 74 68 61 74  t record.** that
2a110 20 53 51 4c 69 74 65 20 63 61 6e 20 68 61 6e 64   SQLite can hand
2a120 6c 65 29 20 6f 72 20 6d 6f 72 65 2e 20 20 42 75  le) or more.  Bu
2a130 74 20 72 65 74 75 72 6e 69 6e 67 20 61 20 73 6d  t returning a sm
2a140 61 6c 6c 65 72 20 76 61 6c 75 65 20 6d 69 67 68  aller value migh
2a150 74 0a 2a 2a 20 70 72 65 76 65 6e 74 20 6c 61 72  t.** prevent lar
2a160 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ge memory alloca
2a170 74 69 6f 6e 73 20 77 68 65 6e 20 74 72 79 69 6e  tions when tryin
2a180 67 20 74 6f 20 69 6e 74 65 72 70 72 65 74 20 61  g to interpret a
2a190 0a 2a 2a 20 63 6f 72 72 75 70 74 20 64 61 74 72  .** corrupt datr
2a1a0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2a1b0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
2a1c0 6e 74 61 74 69 6f 6e 20 6d 65 72 65 6c 79 20 72  ntation merely r
2a1d0 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20  eturns the size 
2a1e0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
2a1f0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  g.** database fi
2a200 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  le..*/.sqlite3_i
2a210 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
2a220 65 4d 61 78 52 65 63 6f 72 64 53 69 7a 65 28 42  eMaxRecordSize(B
2a230 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a240 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2a250 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2a260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a270 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a280 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 65  OR_VALID );.  re
2a290 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 2d 3e  turn pCur->pBt->
2a2a0 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
2a2b0 74 65 33 5f 69 6e 74 36 34 29 70 43 75 72 2d 3e  te3_int64)pCur->
2a2c0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  pBt->nPage;.}../
2a2d0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
2a2e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
2a2f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
2a300 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
2a310 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
2a320 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
2a330 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
2a340 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2a350 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
2a360 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
2a370 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
2a380 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
2a390 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
2a3a0 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
2a3b0 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
2a3c0 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
2a3d0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
2a3e0 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
2a3f0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
2a400 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
2a410 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2a420 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
2a430 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
2a440 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2a450 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
2a460 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
2a470 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
2a480 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2a490 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
2a4a0 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
2a4b0 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
2a4c0 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
2a4d0 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
2a4e0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
2a4f0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
2a500 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
2a510 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2a520 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
2a530 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2a540 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
2a550 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
2a560 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
2a570 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
2a580 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
2a590 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
2a5a0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2a5b0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
2a5c0 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
2a5d0 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
2a5e0 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
2a5f0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
2a600 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
2a610 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
2a620 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2a630 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
2a640 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
2a650 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
2a660 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
2a670 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
2a680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
2a690 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
2a6a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a6c0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2a6d0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
2a6e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a6f0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
2a700 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
2a710 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
2a720 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
2a730 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
2a740 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
2a750 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
2a760 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a780 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
2a790 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
2a7a0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
2a7b0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2a7c0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
2a7d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a7e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2a7f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a800 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a810 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
2a820 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
2a830 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2a840 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
2a850 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
2a860 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
2a870 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
2a880 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
2a890 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
2a8a0 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
2a8b0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
2a8c0 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
2a8d0 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
2a8e0 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
2a8f0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
2a900 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
2a910 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
2a920 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
2a930 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
2a940 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
2a950 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
2a960 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
2a970 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
2a980 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2a990 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
2a9a0 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
2a9b0 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
2a9c0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
2a9d0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
2a9e0 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
2a9f0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
2aa00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2aa10 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
2aa20 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
2aa30 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
2aa40 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2aa50 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
2aa60 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2aa70 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
2aa80 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
2aa90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2aaa0 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
2aab0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
2aac0 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
2aad0 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
2aae0 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
2aaf0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2ab00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ab10 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2ab20 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
2ab30 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
2ab40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ab50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2ab60 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2ab70 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
2ab80 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41  (ppPage==0) ? PA
2ab90 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
2aba0 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
2abb0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2abc0 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
2abd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2abe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
2abf0 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
2ac00 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
2ac10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
2ac20 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
2ac30 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
2ac40 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
2ac50 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
2ac60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2ac70 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
2ac80 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
2ac90 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
2aca0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
2acb0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
2acc0 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
2acd0 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
2ace0 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
2acf0 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
2ad00 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
2ad10 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
2ad20 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
2ad30 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
2ad40 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
2ad50 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
2ad60 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
2ad70 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
2ad80 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
2ad90 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
2ada0 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
2adb0 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
2adc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2add0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
2ade0 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
2adf0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
2ae00 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
2ae10 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
2ae20 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
2ae30 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2ae40 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
2ae50 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
2ae60 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
2ae70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2ae80 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
2ae90 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
2aea0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2aeb0 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
2aec0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aee0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
2aef0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
2af00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2af10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2af20 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
2af30 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
2af40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2af50 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
2af60 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
2af70 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
2af80 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
2af90 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
2afa0 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
2afb0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
2afc0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
2afd0 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
2afe0 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
2aff0 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
2b000 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
2b010 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b020 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2b030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b040 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2b050 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
2b060 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
2b070 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
2b080 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
2b090 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
2b0a0 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
2b0b0 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
2b0c0 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
2b0d0 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
2b0e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b0f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b100 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2b110 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
2b120 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
2b130 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
2b140 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
2b150 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
2b160 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
2b170 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70  ting to. The eOp
2b180 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
2b190 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
2b1a0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2b1b0 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  0: The operation
2b1c0 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75   is a read. Popu
2b1d0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
2b1e0 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a  w cache..**   1:
2b1f0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
2b200 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c  s a write. Popul
2b210 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
2b220 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20   cache..**.** A 
2b230 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
2b240 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
2b250 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
2b260 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
2b270 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
2b280 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
2b290 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
2b2a0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
2b2b0 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
2b2c0 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
2b2d0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
2b2e0 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
2b2f0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
2b300 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
2b310 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
2b320 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2b330 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
2b340 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2b350 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66   pages.** this f
2b360 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f  unction may allo
2b370 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
2b380 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  nd lazily popula
2b390 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  te.** the overfl
2b3a0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
2b3b0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
2b3c0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
2b3d0 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
2b3e0 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
2b3f0 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
2b400 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
2b410 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
2b420 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
2b430 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
2b440 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
2b450 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
2b460 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74  located, it must
2b470 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
2b480 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
2b490 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
2b4a0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
2b4b0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
2b4c0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
2b4d0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
2b4e0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
2b4f0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
2b500 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
2b510 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
2b520 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
2b530 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2b540 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
2b550 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
2b560 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
2b570 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
2b580 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
2b590 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
2b5a0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
2b5b0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
2b5c0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
2b5d0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
2b5e0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
2b5f0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
2b600 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
2b610 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
2b620 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
2b630 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
2b640 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
2b650 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
2b660 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
2b670 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
2b680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2b690 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
2b6a0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
2b6b0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
2b6c0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
2b6d0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
2b6e0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
2b6f0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
2b700 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
2b710 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
2b720 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
2b730 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
2b740 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
2b750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2b760 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
2b770 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2b780 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20  r->pPage;       
2b790 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
2b7a0 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
2b7b0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
2b7c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2b7d0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
2b7e0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
2b7f0 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
2b800 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65  ongs to */.#ifde
2b810 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
2b820 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
2b830 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20  unsigned char * 
2b840 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20  const pBufStart 
2b850 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53  = pBuf;     /* S
2b860 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c  tart of original
2b870 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23   out buffer */.#
2b880 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2b890 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
2b8a0 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f  rt( eOp==0 || eO
2b8b0 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
2b8c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b8d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b8e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b8f0 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
2b900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
2b910 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2b920 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
2b930 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
2b940 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
2b950 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20  info.pPayload;. 
2b960 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
2b970 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
2b980 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
2b990 20 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61   assert( aPayloa
2b9a0 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d > pPage->aData
2b9b0 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29   );.  if( (uptr)
2b9c0 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67  (aPayload - pPag
2b9d0 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74  e->aData) > (pBt
2b9e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
2b9f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2ba00 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ) ){.    /* Tryi
2ba10 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
2ba20 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
2ba30 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
2ba40 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20  an error.  The. 
2ba50 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61     ** conditiona
2ba60 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c  l above is reall
2ba70 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50  y:.    **    &aP
2ba80 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
2ba90 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
2baa0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
2bab0 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a  sableSize].    *
2bac0 2a 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20  * but is recast 
2bad0 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  into its current
2bae0 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69   form to avoid i
2baf0 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
2bb00 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a  problems.    */.
2bb10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bb20 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2bb30 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
2bb40 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
2bb50 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
2bb60 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
2bb70 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
2bb80 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
2bb90 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
2bba0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
2bbb0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
2bbc0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
2bbd0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
2bbe0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
2bbf0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
2bc00 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
2bc10 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
2bc20 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
2bc30 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
2bc40 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
2bc50 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
2bc60 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
2bc70 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
2bc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
2bc90 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
2bca0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20  .nLocal;.  }... 
2bcb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bcc0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
2bcd0 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
2bce0 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
2bcf0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
2bd00 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
2bd10 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
2bd20 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
2bd30 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
2bd40 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
2bd50 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
2bd60 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20  .nLocal]);..    
2bd70 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  /* If the BtCurs
2bd80 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68  or.aOverflow[] h
2bd90 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
2bda0 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
2bdb0 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20  it now..    **. 
2bdc0 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
2bdd0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
2bde0 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
2bdf0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
2be00 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
2be10 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
2be20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
2be30 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
2be40 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
2be50 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
2be60 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
2be70 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
2be80 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
2be90 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
2bea0 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
2beb0 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
2bec0 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
2bed0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
2bee0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
2bef0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2bf00 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2bf10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
2bf20 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
2bf30 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
2bf40 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
2bf50 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
2bf60 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  e;.      if( pCu
2bf70 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a  r->aOverflow==0.
2bf80 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a         || nOvfl*
2bf90 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f  (int)sizeof(Pgno
2bfa0 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ) > sqlite3Mallo
2bfb0 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65  cSize(pCur->aOve
2bfc0 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a  rflow).      ){.
2bfd0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
2bfe0 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
2bff0 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
2c000 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
2c010 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32  verflow, nOvfl*2
2c020 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20  *sizeof(Pgno).  
2c030 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2c040 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
2c050 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c060 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2c070 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
2c080 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
2c090 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
2c0a0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
2c0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
2c0c0 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
2c0d0 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
2c0e0 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
2c0f0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2c100 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
2c110 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  vfl;.    }else{.
2c120 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2c130 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2c140 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
2c150 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
2c160 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  the.      ** ent
2c170 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
2c180 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
2c190 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
2c1a0 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20  , skip.      ** 
2c1b0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
2c1c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2c1d0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
2c1e0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
2c1f0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ze] ){.        i
2c200 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
2c210 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  flSize);.       
2c220 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
2c230 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
2c240 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ];.        offse
2c250 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
2c260 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
2c270 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
2c280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c290 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20  && amt>0 );.    
2c2a0 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20  while( nextPage 
2c2b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ){.      /* If r
2c2c0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
2c2d0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
2c2e0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
2c2f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2c300 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2c310 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
2c320 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
2c330 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
2c340 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
2c350 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
2c360 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
2c370 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2c380 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
2c390 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ;..      if( off
2c3a0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
2c3b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2c3c0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
2c3d0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
2c3e0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
2c3f0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2c400 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
2c410 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
2c420 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
2c430 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2c440 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
2c450 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
2c460 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
2c470 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
2c480 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
2c490 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
2c4a0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
2c4b0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
2c4c0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
2c4d0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
2c4e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c4f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2c500 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2c510 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
2c520 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c530 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
2c540 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
2c550 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
2c560 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
2c570 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
2c580 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
2c590 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
2c5a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c5b0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
2c5c0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
2c5d0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
2c5e0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
2c5f0 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
2c600 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
2c610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c620 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
2c630 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
2c640 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
2c650 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
2c660 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
2c670 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
2c680 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
2c690 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
2c6a0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
2c6b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2c6c0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
2c6d0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
2c6e0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
2c6f0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
2c700 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
2c710 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
2c720 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
2c730 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
2c740 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
2c750 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2c760 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
2c770 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2c780 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
2c790 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
2c7a0 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
2c7b0 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
2c7c0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
2c7d0 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
2c7e0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
2c7f0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
2c800 65 72 65 20 61 72 65 20 6e 6f 20 64 69 72 74 79  ere are no dirty
2c810 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
2c820 67 65 2d 63 61 63 68 65 0a 20 20 20 20 20 20 20  ge-cache.       
2c830 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74   **   4) the dat
2c840 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
2c850 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
2c860 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61    **   5) the pa
2c870 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
2c880 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20   WAL file.      
2c890 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61    **   6) at lea
2c8a0 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
2c8b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
2c8c0 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
2c8d0 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
2c8e0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2c8f0 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
2c900 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
2c910 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2c920 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
2c930 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
2c940 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
2c950 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
2c960 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
2c970 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
2c980 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
2c990 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
2c9a0 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
2c9b0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
2c9c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c9d0 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
2ca10 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
2ca20 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
2ca60 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2ca70 65 72 44 69 72 65 63 74 52 65 61 64 4f 6b 28 70  erDirectReadOk(p
2ca80 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
2ca90 50 61 67 65 29 20 20 20 20 2f 2a 20 28 33 2c 34  Page)    /* (3,4
2caa0 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ,5) */.         
2cab0 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
2cac0 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cae0 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
2caf0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2cb00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
2cb10 65 20 2a 66 64 20 3d 20 73 71 6c 69 74 65 33 50  e *fd = sqlite3P
2cb20 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
2cb30 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
2cb40 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
2cb50 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
2cb60 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
2cb70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2cb80 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74  ( aWrite>=pBufSt
2cb90 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20  art );          
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cbb0 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a  * due to (6) */.
2cbc0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2cbd0 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
2cbe0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
2cbf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
2cc00 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
2cc10 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
2cc20 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
2cc30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
2cc40 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
2cc50 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
2cc60 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
2cc70 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
2cc80 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
2cc90 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
2cca0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
2ccb0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
2ccc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ccd0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
2cce0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
2ccf0 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
2cd00 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20          (eOp==0 
2cd10 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
2cd20 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
2cd30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
2cd40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cd50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2cd60 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
2cd70 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
2cd80 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
2cd90 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
2cda0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
2cdb0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
2cdc0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
2cdd0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
2cde0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
2cdf0 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ce10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
2ce20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2ce30 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
2ce40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ce50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
2ce60 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
2ce70 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74  if( amt==0 ) ret
2ce80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2ce90 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
2cea0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2ceb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
2cec0 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Idx++;.    }.  }
2ced0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
2cee0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
2cef0 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  {.    /* Overflo
2cf00 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65  w chain ends pre
2cf10 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20  maturely */.    
2cf20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2cf30 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
2cf40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2cf50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
2cf60 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
2cf70 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
2cf80 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
2cf90 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
2cfa0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
2cfb0 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
2cfc0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
2cfd0 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
2cfe0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
2cff0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
2d000 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
2d010 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
2d020 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
2d030 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
2d040 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
2d050 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
2d060 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
2d070 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
2d080 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
2d090 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
2d0a0 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
2d0b0 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
2d0c0 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
2d0d0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
2d0e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2d0f0 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
2d100 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
2d110 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
2d120 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
2d130 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
2d140 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
2d150 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
2d160 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
2d170 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
2d180 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
2d190 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
2d1a0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
2d1b0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
2d1c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
2d1d0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
2d1e0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
2d1f0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
2d200 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
2d210 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
2d220 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
2d230 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
2d240 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
2d250 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d260 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
2d270 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2d280 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
2d290 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
2d2a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d2b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2d2c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d2d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d2e0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2d2f0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2d300 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  e>=0 && pCur->pP
2d310 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
2d320 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2d330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2d340 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
2d350 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
2d360 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
2d370 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
2d380 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
2d390 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c  s variant of sql
2d3a0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2d3b0 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66  () works even if
2d3c0 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
2d3d0 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55  not.** in the CU
2d3e0 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65  RSOR_VALID state
2d3f0 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  .  It is only us
2d400 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
2d410 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a  3_blob_read().**
2d420 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
2d430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d440 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74  IT_INCRBLOB.stat
2d450 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2d460 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  NE int accessPay
2d470 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42  loadChecked(.  B
2d480 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20  tCursor *pCur,. 
2d490 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75   u32 offset,.  u
2d4a0 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a  32 amt,.  void *
2d4b0 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pBuf.){.  int rc
2d4c0 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  ;.  if ( pCur->e
2d4d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2d4e0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
2d4f0 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
2d500 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d510 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2d520 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ed(pCur) );.  rc
2d530 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43   = btreeRestoreC
2d540 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2d550 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
2d560 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61   ? rc : accessPa
2d570 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2d580 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
2d590 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
2d5a0 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
2d5b0 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ked(BtCursor *pC
2d5c0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
2d5d0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
2d5e0 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Buf){.  if( pCur
2d5f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d600 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2d610 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2d620 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2d630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  ;.    return acc
2d640 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2d650 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
2d660 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  uf, 0);.  }else{
2d670 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
2d680 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  ssPayloadChecked
2d690 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
2d6a0 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d  mt, pBuf);.  }.}
2d6b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2d6c0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20  E_OMIT_INCRBLOB 
2d6d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
2d6e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
2d6f0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
2d700 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
2d710 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
2d720 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
2d730 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
2d740 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
2d750 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
2d760 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
2d770 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
2d780 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
2d790 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
2d7a0 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
2d7b0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
2d7c0 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
2d7d0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
2d7e0 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
2d7f0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2d800 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
2d810 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
2d820 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
2d830 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
2d840 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
2d850 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d860 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2d870 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
2d880 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
2d890 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
2d8a0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
2d8b0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
2d8c0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
2d8d0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
2d8e0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
2d8f0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
2d900 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
2d910 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
2d920 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
2d930 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
2d940 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
2d950 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
2d960 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
2d970 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
2d980 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2d990 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
2d9a0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
2d9b0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
2d9c0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
2d9d0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
2d9e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
2d9f0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
2da00 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
2da10 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
2da20 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
2da30 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
2da40 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
2da50 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
2da60 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
2da70 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
2da80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2da90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
2daa0 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
2dab0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
2dac0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
2dad0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
2dae0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
2daf0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
2db00 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
2db10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
2db20 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
2db30 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
2db40 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20  .){.  int amt;. 
2db50 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
2db60 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
2db70 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  =0 && pCur->pPag
2db80 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e);.  assert( pC
2db90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2dba0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2dbb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2dbc0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2dbd0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2dbe0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
2dbf0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2dc00 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2dc10 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
2dc20 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2dc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2dc40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
2dc50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2dc60 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2dc70 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  d>pCur->pPage->a
2dc80 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
2dc90 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
2dca0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2dcb0 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  oad<pCur->pPage-
2dcc0 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52  >aDataEnd ||CORR
2dcd0 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d  UPT_DB);.  amt =
2dce0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2dcf0 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69  al;.  if( amt>(i
2dd00 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  nt)(pCur->pPage-
2dd10 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
2dd20 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
2dd30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2dd40 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73   is too little s
2dd50 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
2dd60 20 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65   for the expecte
2dd70 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20  d amount.    ** 
2dd80 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74  of local content
2dd90 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20  . Database must 
2dda0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2ddb0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
2ddc0 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74  PT_DB );.    amt
2ddd0 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28   = MAX(0, (int)(
2dde0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
2ddf0 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
2de00 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20  fo.pPayload));. 
2de10 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33   }.  *pAmt = (u3
2de20 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  2)amt;.  return 
2de30 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
2de40 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
2de50 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
2de60 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
2de70 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
2de80 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
2de90 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
2dea0 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
2deb0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
2dec0 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
2ded0 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
2dee0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2def0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2df00 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
2df10 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
2df20 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
2df30 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
2df40 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
2df50 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
2df60 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
2df70 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
2df80 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
2df90 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
2dfa0 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
2dfb0 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
2dfc0 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
2dfd0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
2dfe0 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
2dff0 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
2e000 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
2e010 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
2e020 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
2e030 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
2e040 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
2e050 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
2e060 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
2e070 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
2e080 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
2e090 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
2e0a0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2e0b0 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  adFetch(BtCursor
2e0c0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
2e0d0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
2e0e0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
2e0f0 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
2e100 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2e110 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
2e120 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2e130 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
2e140 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
2e150 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
2e160 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
2e170 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
2e180 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2e190 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2e1a0 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
2e1b0 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
2e1c0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
2e1d0 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
2e1e0 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
2e1f0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
2e200 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
2e210 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
2e220 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
2e230 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
2e240 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
2e250 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
2e260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e270 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
2e280 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2e290 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
2e2a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2e2b0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
2e2c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2e2d0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2e2e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e2f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e300 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2e310 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e320 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
2e330 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
2e340 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2e350 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
2e360 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
2e370 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
2e380 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2e390 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e3a0 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  KPT;.  }.  pCur-
2e3b0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2e3c0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2e3d0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2e3e0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2e3f0 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61  Ovfl);.  pCur->a
2e400 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e410 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20  ] = pCur->ix;.  
2e420 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e430 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72  r->iPage] = pCur
2e440 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2e450 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  >ix = 0;.  pCur-
2e460 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 63 20 3d  >iPage++;.  rc =
2e470 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2e480 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
2e490 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20  Cur->pPage,.    
2e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4b0 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e      pCur, pCur->
2e4c0 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2e4d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e4e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 65 74 4d 65  _OK ){.    setMe
2e4f0 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e  mpageRoot(pCur->
2e500 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e  pPage, pCur->pgn
2e510 6f 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65  oRoot);.  }.  re
2e520 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
2e530 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2e540 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
2e550 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
2e560 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
2e570 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
2e580 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
2e590 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
2e5a0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
2e5b0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
2e5c0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
2e5d0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
2e5e0 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
2e5f0 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
2e600 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
2e610 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
2e620 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
2e630 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2e640 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2e650 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
2e660 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2e670 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2e680 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2e690 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
2e6a0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
2e6b0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
2e6c0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
2e6d0 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
2e6e0 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
2e6f0 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e710 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
2e720 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
2e730 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
2e740 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2e750 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
2e760 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2e770 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2e780 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2e790 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2e7a0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
2e7b0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
2e7c0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2e7d0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2e7e0 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
2e7f0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
2e800 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
2e810 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2e820 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
2e830 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2e840 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
2e850 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
2e860 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
2e870 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
2e880 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
2e890 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2e8a0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2e8b0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2e8c0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
2e8d0 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
2e8e0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
2e8f0 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
2e900 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2e910 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
2e920 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
2e930 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
2e940 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
2e950 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
2e960 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2e970 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72   *pLeaf;.  asser
2e980 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2e990 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2e9a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2e9b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2e9c0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2e9d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
2e9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e9f0 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2ea00 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
2ea10 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2ea20 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2ea30 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
2ea40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2ea50 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  , .    pCur->pPa
2ea60 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  ge->pgno.  );.  
2ea70 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
2ea80 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2ea90 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
2eaa0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2eab0 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
2eac0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2ead0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2eae0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2eaf0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2eb00 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2eb10 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69  r->ix = pCur->ai
2eb20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2eb30 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43  1];.  pLeaf = pC
2eb40 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75  ur->pPage;.  pCu
2eb50 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2eb60 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e  >apPage[--pCur->
2eb70 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73  iPage];.  releas
2eb80 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65  ePageNotNull(pLe
2eb90 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  af);.}../*.** Mo
2eba0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2ebb0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2ebc0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2ebd0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2ebe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2ebf0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2ec00 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2ec10 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2ec20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2ec30 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2ec40 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2ec50 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2ec60 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2ec70 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2ec80 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2ec90 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2eca0 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2ecb0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2ecc0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2ecd0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2ece0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2ecf0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2ed00 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2ed10 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2ed20 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2ed30 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2ed40 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2ed50 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2ed60 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75  LID and this rou
2ed70 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2ed80 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72  ITE_EMPTY. Other
2ed90 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72  wise,.** the cur
2eda0 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
2edb0 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
2edc0 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
2edd0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72   the root.** (or
2ede0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
2edf0 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
2ee00 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2ee10 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
2ee20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
2ee30 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2ee40 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
2ee50 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
2ee60 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
2ee70 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
2ee80 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2ee90 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
2eea0 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
2eeb0 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
2eec0 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
2eed0 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
2eee0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
2eef0 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
2ef00 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
2ef10 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2ef20 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2ef30 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
2ef40 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
2ef50 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
2ef60 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
2ef70 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
2ef80 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
2ef90 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2efa0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2efb0 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
2efc0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
2efd0 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
2efe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2eff0 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
2f000 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2f010 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
2f020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f030 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2f040 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2f050 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2f060 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
2f070 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
2f080 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2f090 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2f0a0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
2f0b0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2f0c0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
2f0d0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
2f0e0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2f0f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2f100 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  te < CURSOR_REQU
2f110 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d  IRESEEK || pCur-
2f120 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73  >iPage<0 );.  as
2f130 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2f140 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Root>0 || pCur->
2f150 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
2f160 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2f170 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2f180 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2f190 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2f1a0 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29  ull(pCur->pPage)
2f1b0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d  ;.      while( -
2f1c0 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a  -pCur->iPage ){.
2f1d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2f1e0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2f1f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2f200 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  age]);.      }. 
2f210 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65       pCur->pPage
2f220 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2f230 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  0];.      goto s
2f240 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
2f250 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
2f260 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
2f270 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2f280 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2f290 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
2f2a0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2f2b0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2f2c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
2f2d0 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
2f2e0 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
2f2f0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2f300 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2f310 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2f320 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
2f330 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2f340 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
2f350 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2f360 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2f370 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2f380 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2f390 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
2f3a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  r);.    }.    rc
2f3b0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2f3c0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
2f3d0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2f3e0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
2f3f0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2f400 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
2f410 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2f420 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
2f430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f440 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f450 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2f460 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2f470 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  c;.    }.    set
2f480 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72  MempageRoot(pCur
2f490 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70  ->pPage, pCur->p
2f4a0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43  gnoRoot);.    pC
2f4b0 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
2f4c0 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
2f4d0 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ey = pCur->pPage
2f4e0 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20  ->intKey;.  }.  
2f4f0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
2f500 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
2f510 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
2f520 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
2f530 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
2f540 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
2f550 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
2f560 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
2f570 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
2f580 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
2f590 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
2f5a0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
2f5b0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
2f5c0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
2f5d0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
2f5e0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
2f5f0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2f600 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
2f610 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
2f620 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
2f630 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
2f640 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2f650 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
2f660 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
2f670 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
2f680 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2f690 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
2f6a0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
2f6b0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2f6c0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
2f6d0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
2f6e0 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
2f6f0 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
2f700 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
2f710 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
2f720 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
2f730 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
2f740 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
2f750 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
2f760 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
2f770 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2f780 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
2f790 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
2f7a0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
2f7b0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
2f7c0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
2f7d0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
2f7e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
2f7f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2f800 54 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61  T_PAGE(pCur->pPa
2f810 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69  ge);.  }..skip_i
2f820 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69  nit:  .  pCur->i
2f830 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
2f840 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2f850 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2f860 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
2f870 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  |BTCF_ValidNKey|
2f880 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2f890 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
2f8a0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
2f8b0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
2f8c0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2f8d0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2f8e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
2f8f0 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
2f900 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
2f910 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
2f920 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
2f930 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f940 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
2f950 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
2f960 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
2f970 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2f980 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2f990 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2f9a0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2f9b0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
2f9c0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2f9d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f9e0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2f9f0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2fa00 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72  E_EMPTY;.  }.  r
2fa10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fa20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2fa30 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
2fa40 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
2fa50 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
2fa60 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
2fa70 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2fa80 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
2fa90 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
2faa0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
2fab0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
2fac0 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
2fad0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
2fae0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2faf0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
2fb00 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2fb10 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2fb20 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2fb30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2fb40 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2fb50 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2fb60 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2fb70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2fb80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2fb90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2fba0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2fbb0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
2fbc0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
2fbd0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
2fbe0 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d   pCur->ix<pPage-
2fbf0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
2fc00 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
2fc10 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
2fc20 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63  ur->ix));.    rc
2fc30 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2fc40 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
2fc50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fc60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2fc70 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
2fc80 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
2fc90 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2fca0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
2fcb0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
2fcc0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
2fcd0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
2fce0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
2fcf0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2fd00 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
2fd10 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
2fd20 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
2fd30 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
2fd40 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
2fd50 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
2fd60 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
2fd70 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2fd80 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2fd90 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
2fda0 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
2fdb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2fdc0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
2fdd0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
2fde0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
2fdf0 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
2fe00 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2fe10 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
2fe20 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
2fe30 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2fe40 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2fe50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2fe60 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2fe70 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2fe80 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2fe90 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2fea0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2feb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2fec0 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
2fed0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
2fee0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
2fef0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
2ff00 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2ff10 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2ff20 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2ff30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2ff40 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2ff50 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
2ff60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2ff70 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
2ff80 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2ff90 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
2ffa0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2ffb0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
2ffc0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2ffd0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2ffe0 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
2fff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30000 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
30010 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
30020 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
30030 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
30040 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
30050 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
30060 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
30070 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
30080 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
30090 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
300a0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
300b0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
300c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
300d0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
300e0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
300f0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
30100 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
30110 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
30120 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
30130 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30140 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
30150 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
30160 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
30170 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
30180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
301a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
301b0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
301c0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
301d0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
301e0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
301f0 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a  SQLITE_EMPTY ){.
30200 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
30210 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
30220 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
30230 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ell==0 );.    *p
30240 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  Res = 1;.    rc 
30250 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
30260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30270 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
30280 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
30290 69 66 20 63 75 72 73 6f 72 20 70 43 75 72 20 64  if cursor pCur d
302a0 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  oes not point to
302b0 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a   a valid row..**
302c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
302d0 43 75 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f  Cur is valid, co
302e0 6e 66 69 67 75 72 65 20 69 74 20 73 6f 20 74 68  nfigure it so th
302f0 61 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  at the next call
30300 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
30310 72 65 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e  reeNext() is a n
30320 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  o-op..*/.#ifndef
30330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
30340 44 4f 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c  DOWFUNC.void sql
30350 69 74 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78  ite3BtreeSkipNex
30360 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
30370 29 7b 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65  ){.  /* We belie
30380 76 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ve that the curs
30390 6f 72 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  or must always b
303a0 65 20 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73  e in the valid s
303b0 74 61 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74  tate when.  ** t
303c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
303d0 61 6c 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70  alled, but the p
303e0 72 6f 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c  roof is difficul
303f0 74 2c 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a  t, so we add an.
30400 20 20 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65    ** ALWaYS() te
30410 73 74 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20  st just in case 
30420 77 65 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f  we are wrong. */
30430 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
30440 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
30450 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20  OR_VALID) ){.   
30460 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
30470 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
30480 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
30490 65 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23  ext = 1;.  }.}.#
304a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
304b0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
304c0 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  */../* Move the 
304d0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
304e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
304f0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
30500 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
30510 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
30520 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
30530 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
30540 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
30550 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
30560 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
30570 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
30580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30590 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
305a0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
305b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
305c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
305d0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
305e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
305f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30600 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
30610 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
30620 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
30630 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
30640 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
30650 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
30660 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
30670 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
30680 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
30690 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
306a0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
306b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
306c0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
306d0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
306e0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
306f0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
30700 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
30710 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
30720 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
30730 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
30740 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
30750 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
30760 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
30770 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
30780 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
30790 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
307a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
307b0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70  ert( pCur->ix==p
307c0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
307d0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
307e0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
307f0 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
30800 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30810 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
30820 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
30830 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
30840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
30850 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
30860 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
30870 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
30880 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
30890 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
308a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
308b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
308c0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
308d0 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
308e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
308f0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
30900 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
30910 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
30920 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
30930 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65  MPTY ){.    asse
30940 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
30950 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
30960 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
30970 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  ;.    *pRes = 1;
30980 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
30990 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
309a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
309b0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
309c0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
309d0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
309e0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
309f0 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
30a00 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
30a10 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
30a20 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
30a30 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
30a40 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
30a50 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
30a60 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
30a70 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
30a80 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
30a90 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
30aa0 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
30ab0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
30ac0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
30ad0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
30ae0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
30af0 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
30b00 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
30b10 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
30b20 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
30b30 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
30b40 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
30b50 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
30b60 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
30b70 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
30b80 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
30b90 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
30ba0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
30bb0 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
30bc0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
30bd0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
30be0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
30bf0 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
30c00 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
30c10 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
30c20 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
30c30 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
30c40 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
30c50 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
30c60 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
30c70 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
30c80 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
30c90 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cb0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
30cc0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
30cd0 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
30ce0 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
30cf0 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
30d00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
30d10 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
30d20 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
30d30 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
30d40 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
30d50 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
30d60 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
30d70 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
30d80 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
30d90 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
30da0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
30db0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
30dc0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
30dd0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
30de0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
30df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
30e00 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
30e10 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
30e20 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61  .** For index ta
30e30 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65  bles, the pIdxKe
30e40 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20  y->eqSeen field 
30e50 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  is set to 1 if t
30e60 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61  here.** exists a
30e70 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  n entry in the t
30e80 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c  able that exactl
30e90 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65  y matches pIdxKe
30ea0 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
30eb0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
30ec0 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
30ed0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
30ee0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
30ef0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
30f00 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
30f10 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
30f20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
30f30 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
30f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30f50 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
30f60 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
30f70 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
30f80 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
30f90 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
30fa0 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
30fb0 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
30fc0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
30fd0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
30fe0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
30ff0 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
31000 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
31010 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
31020 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
31030 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
31040 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
31050 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
31060 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
31070 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
31080 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
31090 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
310a0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
310b0 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
310c0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
310d0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
310e0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
310f0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29  r->curIntKey!=0)
31100 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
31110 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
31120 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
31130 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
31140 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
31150 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
31160 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
31170 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
31180 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b  k */.  if( pIdxK
31190 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72  ey==0.   && pCur
311a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
311b0 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
311c0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
311d0 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
311e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
311f0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
31200 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
31210 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
31220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
31240 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
31250 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66  tKey ){.      if
31260 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
31270 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
31280 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  !=0 ){.        *
31290 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
312a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
312b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
312c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71     /* If the req
312d0 75 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e  uested key is on
312e0 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
312f0 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68  previous key, th
31300 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20  en.      ** try 
31310 74 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69  to get there usi
31320 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  ng sqlite3BtreeN
31330 65 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61  ext() rather tha
31340 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a  n a full.      *
31350 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e  * binary search.
31360 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
31370 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
31380 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   The correct ans
31390 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  wer.      ** is 
313a0 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77  still obtained w
313b0 69 74 68 6f 75 74 20 74 68 69 73 20 63 61 73 65  ithout this case
313c0 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20  , only a little 
313d0 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a  more slowely */.
313e0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
313f0 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74  info.nKey+1==int
31400 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Key ){.        *
31410 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
31420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31430 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29  reeNext(pCur, 0)
31440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31460 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c           getCell
31470 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
31480 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
31490 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
314a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
314b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
314c0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
314d0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
314e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
314f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31510 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31520 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
31530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31550 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
31560 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
31570 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
31580 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
31590 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
315a0 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
315b0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
315c0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
315d0 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
315e0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
315f0 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
31600 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
31610 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
31620 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31630 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
31640 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
31650 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
31660 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
31670 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
31680 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
31690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
316a0 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  TY ){.      asse
316b0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
316c0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
316d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
316e0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
316f0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
31700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31710 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
31720 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
31730 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
31740 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
31750 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
31760 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
31770 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
31780 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
31790 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
317a0 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73 73  ell > 0 );.  ass
317b0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
317c0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
317d0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
317e0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
317f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
31800 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
31810 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
31820 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
31830 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a  r, upr, idx, c;.
31840 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
31850 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
31860 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
31870 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  e;.    u8 *pCell
31880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
318a0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
318b0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
318c0 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
318d0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
318e0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
318f0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
31900 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
31910 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
31920 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
31930 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
31940 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
31950 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
31960 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
31970 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
31980 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
31990 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
319a0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
319b0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
319c0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
319d0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
319e0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
319f0 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
31a00 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
31a10 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
31a20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
31a30 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
31a40 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
31a50 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
31a60 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
31a70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
31a80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
31a90 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
31aa0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
31ab0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
31ac0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
31ad0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
31ae0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
31af0 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
31b00 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
31b10 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
31b20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
31b30 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
31b40 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
31b50 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
31b60 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
31b70 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
31b80 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
31b90 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
31ba0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
31bb0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
31bc0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
31bd0 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
31be0 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69   idx);.        i
31bf0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
31c00 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
31c10 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
31c20 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
31c30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
31c40 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
31c50 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  taEnd ){.       
31c60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
31c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
31c80 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
31c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31ca0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31cb0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
31cc0 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
31cd0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
31ce0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
31cf0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
31d00 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
31d10 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
31d20 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20  >upr ){ c = -1; 
31d30 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
31d40 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
31d50 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key>intKey ){.  
31d60 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
31d70 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x-1;.          i
31d80 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
31d90 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = +1; break; }. 
31da0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31db0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31dc0 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
31dd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   );.          pC
31de0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
31df0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
31e00 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
31e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
31e20 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
31e30 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
31e40 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
31e50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31e60 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
31e70 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
31e80 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
31e90 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
31ea0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
31eb0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
31ec0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
31ed0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
31ee0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
31ef0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31f00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31f20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31f30 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
31f40 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
31f50 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
31f60 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
31f70 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
31f80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
31f90 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
31fa0 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a  t nCell;  /* Siz
31fb0 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63  e of the pCell c
31fc0 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ell in bytes */.
31fd0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
31fe0 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
31ff0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20  pPage, idx);..  
32000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
32010 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
32020 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
32030 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
32040 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
32050 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
32060 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
32070 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
32080 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
32090 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
320a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
320b0 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
320c0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
320d0 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
320e0 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
320f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
32100 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
32110 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
32120 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
32130 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
32140 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
32150 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
32160 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
32170 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
32180 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
32190 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
321a0 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
321b0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
321c0 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
321d0 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
321e0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
321f0 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
32200 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
32210 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
32220 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
32230 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
32240 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
32250 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
32260 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
32270 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
32280 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
32290 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
322a0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
322b0 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
322c0 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
322d0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
322e0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
322f0 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
32300 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
32310 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
32320 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
32330 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
32340 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
32350 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
32360 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
32370 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
32380 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
32390 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
323a0 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
323b0 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
323c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
323d0 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
323e0 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
323f0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
32400 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
32410 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
32420 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
32430 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
32440 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
32450 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
32460 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
32470 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
32480 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
32490 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
324a0 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
324b0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
324c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
324d0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
324e0 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
324f0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
32500 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
32510 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
32520 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
32530 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
32540 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
32550 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
32560 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
32570 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
32580 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
32590 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
325a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
325b0 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
325c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
325d0 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20  an be called. . 
325e0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
325f0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
32600 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
32610 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f  t, the xRecordCo
32620 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61  mpare routine ma
32630 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20  y read.         
32640 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61   ** up to two va
32650 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65  rints past the e
32660 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
32670 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20  . An extra 18 . 
32680 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65           ** byte
32690 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  s of padding is 
326a0 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65  allocated at the
326b0 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
326c0 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  er in.          
326d0 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70  ** case this hap
326e0 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  pens.  */.      
326f0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
32700 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
32710 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
32720 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
32730 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
32740 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
32750 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
32760 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
32770 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
32780 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
32790 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
327a0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
327b0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c  testcase( nCell<
327c0 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  0 );   /* True i
327d0 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e  f key size is 2^
327e0 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20  32 or more */.  
327f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32800 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f  ( nCell==0 );  /
32810 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
32820 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
32830 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x00 */.         
32840 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
32850 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==1 );  /* Inval
32860 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
32870 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a  80 0x80 0x01 */.
32880 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
32890 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20  se( nCell==2 ); 
328a0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61   /* Minimum lega
328b0 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65  l index key size
328c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
328d0 28 20 6e 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65  ( nCell<2 || nCe
328e0 6c 6c 2f 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73  ll/pCur->pBt->us
328f0 61 62 6c 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70  ableSize>pCur->p
32900 42 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  Bt->nPage ){.   
32910 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32920 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
32930 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
32940 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
32950 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
32960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
32970 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
32980 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b  e3Malloc( nCell+
32990 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  18 );.          
329a0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
329b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
329c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
329d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
329e0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
329f0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
32a00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
32a10 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
32a20 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32a30 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
32a40 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
32a50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
32a60 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
32a70 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
32a80 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56  Flags &= ~BTCF_V
32a90 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
32aa0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
32ab0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32ac0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
32ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
32ae0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
32af0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32b00 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
32b10 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
32b20 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
32b30 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
32b40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32b50 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
32b60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32b70 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
32b80 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
32b90 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
32ba0 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
32bb0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
32bc0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
32bd0 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
32be0 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
32bf0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
32c00 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
32c10 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
32c20 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
32c30 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
32c40 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
32c50 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
32c60 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
32c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32c80 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
32c90 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
32ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32cc0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
32cd0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
32ce0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
32cf0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
32d00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32d10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
32d20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
32d30 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
32d40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
32d50 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
32d60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
32d70 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
32d80 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
32d90 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
32da0 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
32db0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
32dc0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
32dd0 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
32de0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
32df0 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
32e00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
32e10 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
32e20 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
32e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32e40 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50  Cur->ix<pCur->pP
32e50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
32e60 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
32e70 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
32e80 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
32e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32ea0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
32eb0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
32ec0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
32ed0 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
32ee0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
32ef0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
32f00 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
32f10 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
32f20 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
32f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
32f40 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
32f50 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
32f60 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
32f70 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
32f80 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
32f90 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
32fa0 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
32fb0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
32fc0 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
32fd0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
32fe0 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
32ff0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
33000 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
33010 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  fl)==0 );.  retu
33020 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
33030 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
33040 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
33050 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
33060 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
33070 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
33080 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
33090 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
330a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
330b0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
330c0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
330d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
330e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
330f0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
33100 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
33110 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
33120 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
33130 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
33140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
33150 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
33160 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
33170 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
33180 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
33190 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
331a0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
331b0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
331c0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
331d0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
331e0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
331f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
33200 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
33210 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
33220 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
33230 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
33240 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
33250 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
33260 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69  * Return an esti
33270 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d  mate for the num
33280 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
33290 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43  he table that pC
332a0 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ur is.** pointin
332b0 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20  g to.  Return a 
332c0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
332d0 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69  if no estimate i
332e0 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
332f0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36  available..*/.i6
33300 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  4 sqlite3BtreeRo
33310 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73  wCountEst(BtCurs
33320 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34  or *pCur){.  i64
33330 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61   n;.  u8 i;..  a
33340 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
33350 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
33360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
33370 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33380 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
33390 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
333a0 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73  * Currently this
333b0 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e   interface is on
333c0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ly called by the
333d0 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20   OP_IfSmaller.  
333e0 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69  ** opcode, and i
333f0 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  t that case the 
33400 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61  cursor will alwa
33410 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a  ys be valid and.
33420 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73    ** will always
33430 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66   point to a leaf
33440 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   node. */.  if( 
33450 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61  NEVER(pCur->eSta
33460 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
33470 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
33480 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
33490 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29  >pPage->leaf==0)
334a0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20   ) return -1;.. 
334b0 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65   n = pCur->pPage
334c0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69  ->nCell;.  for(i
334d0 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
334e0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a  e; i++){.    n *
334f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
33500 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20  ]->nCell;.  }.  
33510 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
33520 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
33530 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
33540 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
33550 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74  atabase. .** Ret
33560 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a  urn value:.**.**
33570 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
33580 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20       success.** 
33590 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
335a0 20 20 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c      cursor is al
335b0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61  ready pointing a
335c0 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  t the last eleme
335d0 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69  nt.**    otherwi
335e0 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b  se        some k
335f0 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63  ind of error occ
33600 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20  urred.**.** The 
33610 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
33620 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
33630 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
33640 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
33650 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
33660 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
33670 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
33680 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
33690 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
336a0 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
336b0 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
336c0 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
336d0 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
336e0 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
336f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
33700 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
33710 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
33720 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
33730 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
33740 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
33750 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
33760 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
33770 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  t in sqlite3Btre
33780 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c  eNext(C,F) is 1,
33790 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72   then the.** cur
337a0 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  sor corresponds 
337b0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
337c0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
337d0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
337e0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74  .** skipped if t
337f0 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  he SQL index had
33800 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69   been a unique i
33810 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67  ndex.  The F arg
33820 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69  ument.** is a hi
33830 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
33840 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72  ent.  SQLite btr
33850 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
33860 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  n does not use.*
33870 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74  * this hint, but
33880 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f   COMDB2 does..*/
33890 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
338a0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
338b0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
338c0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
338d0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
338e0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
338f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
33900 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
33910 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
33920 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
33930 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
33940 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
33950 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
33960 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
33970 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
33980 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
33990 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
339a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
339b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
339c0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
339d0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
339e0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
339f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
33a00 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ONE;.    }.    i
33a10 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
33a20 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
33a30 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
33a40 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
33a50 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
33a60 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
33a70 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
33a80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
33a90 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
33aa0 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20  >pPage;.  idx = 
33ab0 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66  ++pCur->ix;.  if
33ac0 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
33ad0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f   ){.    /* The o
33ae0 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f  nly known way fo
33af0 72 20 74 68 69 73 20 74 6f 20 68 61 70 70 65 6e  r this to happen
33b00 20 69 73 20 66 6f 72 20 74 68 65 72 65 20 74 6f   is for there to
33b10 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72 65 63   be a.    ** rec
33b20 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e 63 74  ursive SQL funct
33b30 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20  ion that does a 
33b40 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
33b50 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a 20 20   as part of a.  
33b60 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68 69 63    ** SELECT whic
33b70 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e  h deletes conten
33b80 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  t out from under
33b90 20 61 6e 20 61 63 74 69 76 65 20 63 75 72 73 6f   an active curso
33ba0 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f  r.    ** in a co
33bb0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
33bc0 69 6c 65 20 77 68 65 72 65 20 74 68 65 20 74 61  ile where the ta
33bd0 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45 54 45  ble being DELETE
33be0 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  -ed from.    ** 
33bf0 68 61 73 20 70 61 67 65 73 20 69 6e 20 63 6f 6d  has pages in com
33c00 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  mon with the tab
33c10 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
33c20 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20 20 2a  .  See TH3.    *
33c30 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74  * module cov1/bt
33c40 72 65 65 37 38 2e 74 65 73 74 20 74 65 73 74 63  ree78.test testc
33c50 61 73 65 20 32 32 30 20 28 32 30 31 38 2d 30 36  ase 220 (2018-06
33c60 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20 20 20  -08) for an.    
33c70 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20  ** example. */. 
33c80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33c90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33ca0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
33cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
33cc0 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
33cd0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
33ce0 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
33cf0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
33d00 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
33d10 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
33d20 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
33d30 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
33d40 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
33d50 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
33d60 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
33d70 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
33d80 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
33d90 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
33da0 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
33db0 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
33dc0 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
33dd0 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
33de0 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
33df0 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
33e00 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
33e10 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66  ->nCell );..  if
33e20 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
33e30 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
33e40 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
33e50 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
33e60 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
33e70 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
33e80 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
33e90 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
33ea0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
33eb0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
33ec0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
33ed0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
33ee0 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
33ef0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
33f00 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
33f10 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
33f20 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
33f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
33f40 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
33f50 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
33f60 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
33f70 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
33f80 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
33f90 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  r->ix>=pPage->nC
33fa0 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
33fb0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
33fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
33fd0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
33fe0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
33ff0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
34000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
34010 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
34020 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
34030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
34050 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
34060 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
34070 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
34080 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
34090 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
340a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
340b0 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  e;.  UNUSED_PARA
340c0 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
340d0 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
340e0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
340f0 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73  e SQLite */.  as
34100 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
34110 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
34120 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
34130 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
34140 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
34150 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
34160 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
34170 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
34180 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
34190 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
341a0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
341b0 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
341c0 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70  eNext(pCur);.  p
341d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
341e0 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  ge;.  if( (++pCu
341f0 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e  r->ix)>=pPage->n
34200 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
34210 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75  ->ix--;.    retu
34220 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
34230 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
34240 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34260 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
34270 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
34280 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
34290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
342a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
342b0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
342c0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
342d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
342e0 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a  Return values:.*
342f0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
34300 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a  OK     success.*
34310 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  *     SQLITE_DON
34320 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69  E   the cursor i
34330 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65  s already on the
34340 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
34350 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  f the table.**  
34360 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
34370 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
34380 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
34390 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
343a0 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
343b0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
343c0 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
343d0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
343e0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
343f0 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
34400 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
34410 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
34420 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
34430 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
34440 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
34450 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
34460 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
34470 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
34480 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34490 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
344a0 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
344b0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
344c0 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
344d0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
344e0 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
344f0 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
34500 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42  ment to sqlite3B
34510 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46  treePrevious(C,F
34520 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20  ) is 1, then.** 
34530 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65  the cursor corre
34540 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
34550 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
34560 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
34570 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
34580 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
34590 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
345a0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
345b0 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e F argument is 
345c0 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65  a.** hint to the
345d0 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65   implement.  The
345e0 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62   native SQLite b
345f0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
34600 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ion does not.** 
34610 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62  use this hint, b
34620 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
34630 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
34640 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
34650 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
34660 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
34670 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
34680 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
34690 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
346a0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
346b0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
346c0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
346d0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
346e0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
346f0 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
34700 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
34710 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
34720 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
34730 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
34740 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
34750 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
34760 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
34770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34780 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
34790 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
347a0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
347b0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
347c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
347d0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
347e0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
347f0 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d  _SKIPNEXT==pCur-
34800 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
34810 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
34820 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
34830 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
34840 69 70 4e 65 78 74 3c 30 20 29 20 72 65 74 75 72  ipNext<0 ) retur
34850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
34860 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
34870 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
34880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34890 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
348a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
348b0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
348c0 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d  ur->ix;.    rc =
348d0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
348e0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
348f0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
34900 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
34910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34920 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
34930 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
34940 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
34950 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20  pCur->ix==0 ){. 
34960 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
34970 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
34980 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
34990 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
349a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
349b0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
349c0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
349d0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
349e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
349f0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
34a00 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
34a10 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
34a20 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
34a30 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
34a40 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a      pCur->ix--;.
34a50 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
34a60 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28  ->pPage;.    if(
34a70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
34a80 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
34a90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
34aa0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
34ab0 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  s(pCur, 0);.    
34ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
34ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
34ae0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
34af0 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
34b00 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
34b10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
34b20 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
34b30 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
34b40 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
34b50 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
34b60 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20  ==0 || flags==1 
34b70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
34b80 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
34b90 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
34ba0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
34bb0 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43  e SQLite */.  pC
34bc0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
34bd0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
34be0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
34bf0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20  F_ValidNKey);.  
34c00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
34c10 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
34c20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
34c30 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75  _VALID.   || pCu
34c40 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70  r->ix==0.   || p
34c50 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66  Cur->pPage->leaf
34c60 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
34c70 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
34c80 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70  s(pCur);.  }.  p
34c90 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74  Cur->ix--;.  ret
34ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34cb0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
34cc0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
34cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34ce0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
34cf0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
34d00 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
34d10 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
34d20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
34d30 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
34d40 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
34d50 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
34d60 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
34d70 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
34d80 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
34d90 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
34da0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
34db0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
34dc0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
34dd0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
34de0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
34df0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
34e00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
34e10 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
34e20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
34e30 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
34e40 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
34e50 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
34e60 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
34e70 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
34e80 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
34e90 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
34ea0 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
34eb0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
34ec0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
34ed0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
34ee0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
34ef0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
34f00 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
34f10 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
34f20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
34f30 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
34f40 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
34f50 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
34f60 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
34f70 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
34f80 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
34f90 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
34fa0 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
34fb0 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
34fc0 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
34fd0 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
34fe0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
34ff0 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
35000 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
35010 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
35020 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
35030 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
35040 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
35050 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
35060 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
35070 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
35080 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
35090 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
350a0 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
350b0 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
350c0 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
350d0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
350e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
350f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
35100 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35110 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
35120 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
35130 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
35140 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
35150 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
35160 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
35170 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
35180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
35190 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
351a0 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
351b0 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
351c0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
351d0 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
351e0 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
351f0 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
35200 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
35210 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
35220 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
35230 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
35240 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
35250 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
35260 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
35270 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
35280 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
35290 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
352a0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
352b0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
352c0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
352d0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
352e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
352f0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
35300 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
35310 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
35320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35330 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
35340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35350 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
35360 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
35370 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
35380 28 6e 65 61 72 62 79 3e 30 20 26 26 20 52 45 51  (nearby>0 && REQ
35390 55 49 52 45 5f 50 54 52 4d 41 50 20 29 20 29 3b  UIRE_PTRMAP ) );
353a0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
353b0 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
353c0 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
353d0 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56  nt(pBt);.  /* EV
353e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31  IDENCE-OF: R-051
353f0 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62  19-02637 The 4-b
35400 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
35410 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
35420 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20   36.  ** stores 
35430 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c  stores the total
35440 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
35450 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
35460 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62  . */.  n = get4b
35470 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
35480 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
35490 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
354a0 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
354b0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
354c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
354d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
354e0 20 45 6e 73 75 72 65 20 70 61 67 65 20 31 20 69   Ensure page 1 i
354f0 73 20 77 72 69 74 61 62 6c 65 2e 20 54 68 69 73  s writable. This
35500 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65   function will e
35510 69 74 68 65 72 20 63 68 61 6e 67 65 20 74 68 65  ither change the
35520 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
35530 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 72 65  pages in the fre
35540 65 2d 6c 69 73 74 20 6f 72 20 74 68 65 20 73 69  e-list or the si
35550 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
35560 73 65 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 62  se file. Since b
35570 6f 74 68 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73  oth.  ** of thes
35580 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 76  e operations inv
35590 6f 6c 76 65 20 6d 6f 64 69 66 79 69 6e 67 20 70  olve modifying p
355a0 61 67 65 20 31 20 68 65 61 64 65 72 20 66 69 65  age 1 header fie
355b0 6c 64 73 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a  lds, page 1.  **
355c0 20 77 69 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79   will definitely
355d0 20 62 65 20 77 72 69 74 74 65 6e 20 62 79 20 74   be written by t
355e0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
355f0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43   If this is an C
35600 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74  ONCURRENT.  ** t
35610 72 61 6e 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75  ransaction, ensu
35620 72 65 20 74 68 65 20 42 74 72 65 65 50 74 72 6d  re the BtreePtrm
35630 61 70 20 73 74 72 75 63 74 75 72 65 20 68 61 73  ap structure has
35640 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
35650 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
35660 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
35670 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
35680 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
35690 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30  n rc;..  if( n>0
356a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
356b0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
356c0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
356d0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
356e0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
356f0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
35700 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
35710 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
35720 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
35730 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
35740 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
35750 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
35760 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
35770 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
35780 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
35790 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
357a0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
357b0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
357c0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
357d0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
357e0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
357f0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
35800 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
35810 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
35820 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
35830 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
35840 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
35850 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4d 6f 64   */.    if( eMod
35860 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
35870 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
35880 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 21 3d  ( ISAUTOVACUUM!=
35890 49 53 43 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a  ISCONCURRENT );.
358a0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
358b0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
358c0 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
358d0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
358e0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
358f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
35900 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
35910 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
35920 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
35930 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
35940 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
35950 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
35960 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
35970 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
35980 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79           if( eTy
35990 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
359a0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
359b0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
359c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
359d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
359e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
359f0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
35a00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
35a10 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
35a20 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
35a30 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
35a40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
35a50 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
35a60 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
35a70 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
35a80 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
35a90 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
35aa0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
35ab0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
35ac0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
35ad0 20 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74    */.    put4byt
35ae0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
35af0 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
35b00 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
35b10 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
35b20 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
35b30 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
35b40 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
35b50 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
35b60 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
35b70 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
35b80 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
35b90 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
35ba0 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
35bb0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
35bc0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
35bd0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
35be0 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
35bf0 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
35c00 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
35c10 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
35c20 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
35c30 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
35c40 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
35c50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
35c60 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
35c70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
35c80 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20  : R-01506-11053 
35c90 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
35ca0 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
35cb0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
35cc0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67     ** is the pag
35cd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
35ce0 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72  next freelist tr
35cf0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
35d00 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20  list or.        
35d10 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  ** zero if this 
35d20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65  is the last free
35d30 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
35d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
35d50 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
35d60 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
35d70 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
35d80 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
35d90 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38  IDENCE-OF: R-598
35da0 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62  41-13798 The 4-b
35db0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
35dc0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
35dd0 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   32.        ** s
35de0 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e  tores the page n
35df0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
35e00 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
35e10 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f  reelist, or zero
35e20 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   if.        ** t
35e30 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
35e40 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mpty. */.       
35e50 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
35e60 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35e70 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
35e80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35e90 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
35ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
35eb0 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65  nk>mxPage || nSe
35ec0 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20  arch++ > n ){.  
35ed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35ee0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
35ef0 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65  PrevTrunk ? pPre
35f00 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31  vTrunk->pgno : 1
35f10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35f20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
35f30 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
35f40 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
35f50 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
35f60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
35f70 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
35f80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
35f90 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
35fa0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
35fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
35fc0 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
35fd0 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
35fe0 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20  Data!=0 );.     
35ff0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
36000 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54   R-13523-04394 T
36010 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
36020 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
36030 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
36040 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65   ** is the numbe
36050 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70  r of leaf page p
36060 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f  ointers to follo
36070 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20  w. */.      k = 
36080 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
36090 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
360a0 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
360b0 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
360c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
360d0 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
360e0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
360f0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
36100 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
36110 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
36120 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
36130 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
36140 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
36150 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
36160 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
36170 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
36180 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
36190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
361a0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
361b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
361c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
361d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
361e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
361f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36200 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
36210 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
36220 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
36230 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
36240 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
36250 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
36260 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
36270 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
36280 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
36290 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
362a0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
362b0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
362c0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
362d0 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
362e0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
362f0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
36300 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
36310 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
36320 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
36330 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
36340 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
36350 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
36360 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
36370 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
36380 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36390 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
363a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
363b0 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
363c0 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
363d0 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
363e0 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
363f0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
36400 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
36410 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
36420 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
36430 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
36440 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
36450 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
36460 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
36470 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
36480 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
36490 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
364a0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
364b0 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
364c0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
364d0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
364e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
364f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36500 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
36510 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
36520 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
36530 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
36540 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
36550 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
36560 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
36570 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
36580 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
36590 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
365a0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
365b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
365c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
365d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
365e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
365f0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
36600 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
36610 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
36620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36630 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
36640 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
36650 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
36660 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
36670 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
36680 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
36690 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
366a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
366b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
366c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
366d0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
366e0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
366f0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
36700 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
36710 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
36720 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
36730 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
36740 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
36750 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
36760 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
36770 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
36780 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
36790 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
367a0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
367b0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
367c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
367d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
367e0 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
367f0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
36800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
36810 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
36820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
36830 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
36840 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
36850 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
36860 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
36870 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
36880 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
36890 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
368a0 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
368b0 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
368c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
368d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
368e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
368f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
36900 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36910 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36920 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
36930 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
36940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
36950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
36970 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
36980 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
36990 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
369a0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
369b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
369c0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
369d0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
369e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
369f0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
36a00 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
36a10 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
36a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
36a30 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
36a40 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
36a50 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
36a60 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
36a70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
36a80 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
36a90 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
36aa0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
36ab0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
36ac0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36ad0 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
36ae0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
36af0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
36b00 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
36b10 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
36b20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36b30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
36b40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36b50 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
36b60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
36b70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36b80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
36b90 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
36ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
36bb0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
36bc0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
36bd0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
36be0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
36bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
36c00 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
36c10 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
36c20 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
36c30 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
36c40 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
36c50 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
36c60 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
36c70 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
36c80 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
36c90 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
36ca0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
36cb0 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
36cc0 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
36cd0 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
36ce0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
36cf0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
36d00 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
36d10 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
36d20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
36d30 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
36d40 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
36d50 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
36d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
36d70 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
36d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
36d90 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
36da0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
36db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
36dc0 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
36dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
36de0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
36df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
36e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36e20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
36e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36e40 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
36e50 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
36e60 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
36e70 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
36e80 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
36e90 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
36ea0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
36eb0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
36ec0 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
36ed0 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
36ee0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
36ef0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
36f00 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
36f10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
36f20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
36f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
36f40 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
36f50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
36f60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
36f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
36f80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36f90 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
36fa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
36fb0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
36fc0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
36fd0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
36fe0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
36ff0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
37000 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
37010 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
37020 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
37030 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
37040 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
37050 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
37060 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
37070 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
37080 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
37090 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
370a0 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
370b0 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
370c0 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
370d0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
370e0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
370f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
37100 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
37110 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
37120 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
37130 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
37140 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
37150 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
37160 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
37170 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
37180 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
37190 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
371a0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
371b0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
371c0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
371d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
371e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
371f0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
37200 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
37210 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
37220 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
37230 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
37240 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
37250 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
37260 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
37270 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
37280 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
37290 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
372a0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
372b0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
372c0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
372d0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
372e0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
372f0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
37300 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
37310 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
37320 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
37330 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
37340 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
37350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37370 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37380 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
37390 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
373a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
373b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
373c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
373d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
373e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
373f0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
37400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
37410 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
37420 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
37430 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
37440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
37450 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
37460 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
37470 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
37480 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
37490 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
374a0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
374b0 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
374c0 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
374d0 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
374e0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
374f0 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
37500 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
37510 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
37520 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
37530 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
37540 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
37550 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
37560 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
37570 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
37580 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
37590 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
375a0 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
375b0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
375c0 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
375d0 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
375e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
375f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
37600 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
37610 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
37620 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
37630 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
37640 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
37650 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
37660 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
37670 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
37680 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
37690 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
376a0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
376b0 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
376c0 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
376d0 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
376e0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
376f0 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
37700 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
37710 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
37720 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
37730 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
37740 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
37750 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
37760 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
37770 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
37780 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
37790 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
377a0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
377b0 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
377c0 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
377d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
377e0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
377f0 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
37800 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
37810 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
37820 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
37830 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
37840 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
37850 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
37860 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
37870 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
37880 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
37890 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
378a0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
378b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
378c0 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
378d0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
378e0 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
378f0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
37900 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
37910 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37920 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
37930 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
37940 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
37950 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
37960 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
37970 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
37980 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
37990 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
379a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
379b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
379c0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
379d0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
379e0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
379f0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
37a00 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
37a10 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
37a20 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
37a30 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
37a40 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
37a50 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
37a60 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
37a70 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
37a80 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
37a90 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
37aa0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
37ab0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
37ac0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
37ad0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
37ae0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
37af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
37b00 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
37b10 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
37b20 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
37b30 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
37b40 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
37b50 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
37b60 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37b70 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
37b80 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
37b90 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
37ba0 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
37bb0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
37bc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37be0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37bf0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
37c00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
37c10 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
37c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37c30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37c40 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
37c50 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
37c60 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
37c70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
37c80 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
37c90 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
37ca0 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
37cb0 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
37cc0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
37cd0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
37ce0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
37cf0 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
37d00 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
37d10 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
37d20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
37d30 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
37d40 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
37d50 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
37d60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37d70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
37d80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37d90 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
37da0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
37db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37dc0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
37dd0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
37de0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
37df0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
37e00 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
37e10 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
37e20 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
37e30 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 43 4f   }..  assert( CO
37e40 52 52 55 50 54 5f 44 42 20 7c 7c 20 2a 70 50 67  RRUPT_DB || *pPg
37e50 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
37e60 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
37e70 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
37e80 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
37e90 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
37ea0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
37eb0 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  k);.  assert( rc
37ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
37ed0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
37ee0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
37ef0 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29  )->pDbPage)<=1 )
37f00 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
37f10 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70  SQLITE_OK || (*p
37f20 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
37f30 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
37f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
37f50 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
37f60 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
37f70 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
37f80 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
37f90 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
37fa0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
37fb0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
37fc0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
37fd0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
37fe0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
37ff0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
38000 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
38010 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
38020 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
38030 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
38040 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
38050 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
38060 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
38070 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
38080 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
38090 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
380a0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
380b0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
380c0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
380d0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
380e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
380f0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
38100 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
38110 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
38120 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
38130 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
38140 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
38150 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
38160 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
38170 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
38180 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
38190 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
381a0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
381b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
381c0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
381d0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
381e0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
381f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38200 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
38210 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
38220 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
38230 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
38240 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
38250 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
38260 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
38270 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
38280 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
38290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
382a0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
382b0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
382c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
382d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
382f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
38300 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
38310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38320 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
38330 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
38340 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
38350 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
38360 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
38370 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
38380 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
38390 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
383a0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
383b0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
383c0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
383d0 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
383e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
383f0 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
38400 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
38410 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
38420 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
38430 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
38440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
38450 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
38460 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
38470 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
38480 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
38490 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
384a0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
384b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
384c0 65 28 70 50 61 67 65 31 2d 3e 70 44 6