/ Hex Artifact Content
Login

Artifact a41d580524a4cd9b00443b7196d298e05463f6bfcb712853db3abcddc93cf3ab:


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 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
3a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
3a80: 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65  URRENT./*.** The
3a90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3aa0: 74 75 72 65 20 2d 20 42 74 72 65 65 50 74 72 6d  ture - BtreePtrm
3ab0: 61 70 20 2d 20 73 74 6f 72 65 73 20 74 68 65 20  ap - stores the 
3ac0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65  in-memory pointe
3ad0: 72 20 6d 61 70 0a 2a 2a 20 75 73 65 64 20 66 6f  r map.** used fo
3ae0: 72 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  r newly allocate
3af0: 64 20 70 61 67 65 73 20 69 6e 20 43 4f 4e 43 55  d pages in CONCU
3b00: 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
3b10: 6e 73 2e 20 53 75 63 68 20 70 61 67 65 73 20 61  ns. Such pages a
3b20: 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 61 6c 6c  re.** always all
3b30: 6f 63 61 74 65 64 20 69 6e 20 61 20 63 6f 6e 74  ocated in a cont
3b40: 69 67 75 6f 75 73 20 62 6c 6f 63 6b 20 28 66 72  iguous block (fr
3b50: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
3b60: 65 20 66 69 6c 65 29 20 73 74 61 72 74 69 6e 67  e file) starting
3b70: 0a 2a 2a 20 77 69 74 68 20 70 61 67 65 20 42 74  .** with page Bt
3b80: 72 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73 74  reePtrmap.iFirst
3b90: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
3ba0: 75 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72  uct RollbackEntr
3bb0: 79 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 3b  y RollbackEntry;
3bc0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3bd0: 50 74 72 6d 61 70 45 6e 74 72 79 20 50 74 72 6d  PtrmapEntry Ptrm
3be0: 61 70 45 6e 74 72 79 3b 0a 73 74 72 75 63 74 20  apEntry;.struct 
3bf0: 50 74 72 6d 61 70 45 6e 74 72 79 20 7b 0a 20 20  PtrmapEntry {.  
3c00: 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75  Pgno parent;.  u
3c10: 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75  8 eType;.};.stru
3c20: 63 74 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79  ct RollbackEntry
3c30: 20 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a   {.  Pgno pgno;.
3c40: 20 20 50 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20    Pgno parent;. 
3c50: 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74   u8 eType;.};.st
3c60: 72 75 63 74 20 42 74 72 65 65 50 74 72 6d 61 70  ruct BtreePtrmap
3c70: 20 7b 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74   {.  Pgno iFirst
3c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3c90: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e 65       /* First ne
3ca0: 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 50  w page number aP
3cb0: 74 72 5b 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  tr[0] */..  int 
3cc0: 6e 50 74 72 41 6c 6c 6f 63 3b 20 20 20 20 20 20  nPtrAlloc;      
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3ce0: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
3cf0: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f   aPtr[] array */
3d00: 0a 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20 2a  .  PtrmapEntry *
3d10: 61 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  aPtr;           
3d20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 70     /* Array of p
3d30: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
3d40: 72 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 76  rs */..  int nSv
3d50: 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pt;             
3d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
3d70: 20 73 69 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d   size of aSvpt[]
3d80: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
3d90: 6e 53 76 70 74 41 6c 6c 6f 63 3b 20 20 20 20 20  nSvptAlloc;     
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3db0: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
3dc0: 20 61 53 76 70 74 5b 5d 20 2a 2f 0a 20 20 69 6e   aSvpt[] */.  in
3dd0: 74 20 2a 61 53 76 70 74 3b 20 20 20 20 20 20 20  t *aSvpt;       
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3df0: 20 46 69 72 73 74 20 61 52 6f 6c 6c 62 61 63 6b   First aRollback
3e00: 5b 5d 20 65 6e 74 72 79 20 66 6f 72 20 73 61 76  [] entry for sav
3e10: 65 70 6f 69 6e 74 20 69 20 2a 2f 0a 0a 20 20 69  epoint i */..  i
3e20: 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  nt nRollback;   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e40: 2a 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61  * Used size of a
3e50: 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79  Rollback[] array
3e60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62   */.  int nRollb
3e70: 61 63 6b 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  ackAlloc;       
3e80: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
3e90: 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c  ed size of aRoll
3ea0: 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  back[] array */.
3eb0: 20 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20    RollbackEntry 
3ec0: 2a 61 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  *aRollback;     
3ed0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f    /* Array of ro
3ee0: 6c 6c 62 61 63 6b 20 65 6e 74 72 69 65 73 20 2a  llback entries *
3ef0: 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  /.};../* !define
3f00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
3f10: 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
3f20: 49 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  If page number p
3f30: 67 6e 6f 20 69 73 20 67 72 65 61 74 65 72 20 74  gno is greater t
3f40: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
3f50: 42 74 72 65 65 50 74 72 6d 61 70 2e 69 46 69 72  BtreePtrmap.iFir
3f60: 73 74 2c 20 0a 2a 2a 20 73 74 6f 72 65 20 61 6e  st, .** store an
3f70: 20 65 6e 74 72 79 20 66 6f 72 20 69 74 20 69 6e   entry for it in
3f80: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
3f90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
3fa0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 50  tatic int btreeP
3fb0: 74 72 6d 61 70 53 74 6f 72 65 28 0a 20 20 42 74  trmapStore(.  Bt
3fc0: 53 68 61 72 65 64 20 2a 70 42 74 2c 0a 20 20 50  Shared *pBt,.  P
3fd0: 67 6e 6f 20 70 67 6e 6f 2c 0a 20 20 75 38 20 65  gno pgno,.  u8 e
3fe0: 54 79 70 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61  Type, .  Pgno pa
3ff0: 72 65 6e 74 0a 29 7b 0a 20 20 42 74 72 65 65 50  rent.){.  BtreeP
4000: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4010: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4020: 67 6e 6f 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73  gno>=pMap->iFirs
4030: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e  t ){.    int iEn
4040: 74 72 79 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61  try = pgno - pMa
4050: 70 2d 3e 69 46 69 72 73 74 3b 0a 0a 20 20 20 20  p->iFirst;..    
4060: 2f 2a 20 47 72 6f 77 20 74 68 65 20 61 50 74 72  /* Grow the aPtr
4070: 5b 5d 20 61 72 72 61 79 20 61 73 20 72 65 71 75  [] array as requ
4080: 69 72 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c  ired */.    whil
4090: 65 28 20 69 45 6e 74 72 79 3e 3d 70 4d 61 70 2d  e( iEntry>=pMap-
40a0: 3e 6e 50 74 72 41 6c 6c 6f 63 20 29 7b 0a 20 20  >nPtrAlloc ){.  
40b0: 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70      int nNew = p
40c0: 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f  Map->nPtrAlloc ?
40d0: 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63   pMap->nPtrAlloc
40e0: 2a 32 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 50  *2 : 16;.      P
40f0: 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 4e 65 77  trmapEntry *aNew
4100: 20 3d 20 28 50 74 72 6d 61 70 45 6e 74 72 79 2a   = (PtrmapEntry*
4110: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
4120: 28 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 70  (.          pMap
4130: 2d 3e 61 50 74 72 2c 20 6e 4e 65 77 2a 73 69 7a  ->aPtr, nNew*siz
4140: 65 6f 66 28 50 74 72 6d 61 70 45 6e 74 72 79 29  eof(PtrmapEntry)
4150: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
4160: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
4170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4180: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
41a0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 4e   int nByte = (nN
41b0: 65 77 2d 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew-pMap->nPtrAll
41c0: 6f 63 29 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61  oc)*sizeof(Ptrma
41d0: 70 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 20  pEntry);.       
41e0: 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4d   memset(&aNew[pM
41f0: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20  ap->nPtrAlloc], 
4200: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
4210: 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 20 3d 20     pMap->aPtr = 
4220: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4230: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d 20  ap->nPtrAlloc = 
4240: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
4250: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
4260: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
4270: 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 69 66 20  rollback log if 
4280: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
4290: 69 66 28 20 70 4d 61 70 2d 3e 6e 53 76 70 74 3e  if( pMap->nSvpt>
42a0: 30 20 26 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b  0 && pMap->aPtr[
42b0: 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20 29  iEntry].parent )
42c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 61 70  {.      if( pMap
42d0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61  ->nRollback>=pMa
42e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f  p->nRollbackAllo
42f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  c ){.        int
4300: 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 52   nNew = pMap->nR
4310: 6f 6c 6c 62 61 63 6b 20 3f 20 70 4d 61 70 2d 3e  ollback ? pMap->
4320: 6e 52 6f 6c 6c 62 61 63 6b 2a 32 20 3a 20 31 36  nRollback*2 : 16
4330: 3b 0a 20 20 20 20 20 20 20 20 52 6f 6c 6c 62 61  ;.        Rollba
4340: 63 6b 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20  ckEntry *aNew = 
4350: 28 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 2a 29  (RollbackEntry*)
4360: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
4370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61  .            pMa
4380: 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e  p->aRollback, nN
4390: 65 77 2a 73 69 7a 65 6f 66 28 52 6f 6c 6c 62 61  ew*sizeof(Rollba
43a0: 63 6b 45 6e 74 72 79 29 0a 20 20 20 20 20 20 20  ckEntry).       
43b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
43c0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
43d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
43e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
43f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4400: 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61     pMap->aRollba
4410: 63 6b 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ck = aNew;.     
4420: 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c       pMap->nRoll
4430: 62 61 63 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77  backAlloc = nNew
4440: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4450: 20 20 7d 0a 0a 20 20 20 20 20 20 70 4d 61 70 2d    }..      pMap-
4460: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d  >aRollback[pMap-
4470: 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f  >nRollback].pgno
4480: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70   = pgno;.      p
4490: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
44a0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
44b0: 70 61 72 65 6e 74 20 3d 20 70 4d 61 70 2d 3e 61  parent = pMap->a
44c0: 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65  Ptr[iEntry].pare
44d0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  nt;.      pMap->
44e0: 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e  aRollback[pMap->
44f0: 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 65 54 79 70 65  nRollback].eType
4500: 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45   = pMap->aPtr[iE
4510: 6e 74 72 79 5d 2e 65 54 79 70 65 3b 0a 20 20 20  ntry].eType;.   
4520: 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61     pMap->nRollba
4530: 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ck++;.    }..   
4540: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
4550: 50 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Ptr[] array */. 
4560: 20 20 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45     pMap->aPtr[iE
4570: 6e 74 72 79 5d 2e 70 61 72 65 6e 74 20 3d 20 70  ntry].parent = p
4580: 61 72 65 6e 74 3b 0a 20 20 20 20 70 4d 61 70 2d  arent;.    pMap-
4590: 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54  >aPtr[iEntry].eT
45a0: 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 7d  ype = eType;.  }
45b0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
45c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66  E_OK;.}../* !def
45d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
45e0: 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a  _CONCURRENT).**.
45f0: 2a 2a 20 4f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** Open savepoin
4600: 74 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 69 66  t iSavepoint, if
4610: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
4620: 64 79 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  dy open..*/.stat
4630: 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d  ic int btreePtrm
4640: 61 70 42 65 67 69 6e 28 42 74 53 68 61 72 65 64  apBegin(BtShared
4650: 20 2a 70 42 74 2c 20 69 6e 74 20 6e 53 76 70 74   *pBt, int nSvpt
4660: 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  ){.  BtreePtrmap
4670: 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
4680: 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 26  ap;.  if( pMap &
4690: 26 20 6e 53 76 70 74 3e 70 4d 61 70 2d 3e 6e 53  & nSvpt>pMap->nS
46a0: 76 70 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  vpt ){.    int i
46b0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 76 70 74 3e  ;.    if( nSvpt>
46c0: 3d 70 4d 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f  =pMap->nSvptAllo
46d0: 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  c ){.      int n
46e0: 4e 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 53 76 70  New = pMap->nSvp
46f0: 74 41 6c 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e  tAlloc ? pMap->n
4700: 53 76 70 74 41 6c 6c 6f 63 2a 32 20 3a 20 31 36  SvptAlloc*2 : 16
4710: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65  ;.      int *aNe
4720: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
4730: 6c 6f 63 28 70 4d 61 70 2d 3e 61 53 76 70 74 2c  loc(pMap->aSvpt,
4740: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2a 20 6e   sizeof(int) * n
4750: 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
4760: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
4770: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4780: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
4790: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 61  lse{.        pMa
47a0: 70 2d 3e 61 53 76 70 74 20 3d 20 61 4e 65 77 3b  p->aSvpt = aNew;
47b0: 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e  .        pMap->n
47c0: 53 76 70 74 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77  SvptAlloc = nNew
47d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
47e0: 0a 20 20 20 20 66 6f 72 28 69 3d 70 4d 61 70 2d  .    for(i=pMap-
47f0: 3e 6e 53 76 70 74 3b 20 69 3c 6e 53 76 70 74 3b  >nSvpt; i<nSvpt;
4800: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4d 61   i++){.      pMa
4810: 70 2d 3e 61 53 76 70 74 5b 69 5d 20 3d 20 70 4d  p->aSvpt[i] = pM
4820: 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 3b 0a 20  ap->nRollback;. 
4830: 20 20 20 7d 0a 20 20 20 20 70 4d 61 70 2d 3e 6e     }.    pMap->n
4840: 53 76 70 74 20 3d 20 6e 53 76 70 74 3b 0a 20 20  Svpt = nSvpt;.  
4850: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
4860: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 21 64 65  TE_OK;.}../* !de
4870: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4880: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a  T_CONCURRENT).**
4890: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 28 69 66  .** Rollback (if
48a0: 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
48b0: 4f 4c 4c 42 41 43 4b 29 20 6f 72 20 72 65 6c 65  OLLBACK) or rele
48c0: 61 73 65 20 28 69 66 20 6f 70 3d 3d 53 41 56 45  ase (if op==SAVE
48d0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 0a 2a  POINT_RELEASE).*
48e0: 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 53 76 70  * savepoint iSvp
48f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4900: 64 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e 64  d btreePtrmapEnd
4910: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4920: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 76 70  int op, int iSvp
4930: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
4940: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
4950: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
4960: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
4970: 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
4980: 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d 3d 53 41 56  LBACK || op==SAV
4990: 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
49a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
49b0: 76 70 74 3e 3d 30 20 7c 7c 20 28 69 53 76 70 74  vpt>=0 || (iSvpt
49c0: 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
49d0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
49e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 53 76 70 74  );.    if( iSvpt
49f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 61 70  <0 ){.      pMap
4a00: 2d 3e 6e 53 76 70 74 20 3d 20 30 3b 0a 20 20 20  ->nSvpt = 0;.   
4a10: 20 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61     pMap->nRollba
4a20: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  ck = 0;.      me
4a30: 6d 73 65 74 28 70 4d 61 70 2d 3e 61 50 74 72 2c  mset(pMap->aPtr,
4a40: 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29   0, sizeof(Pgno)
4a50: 20 2a 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c   * pMap->nPtrAll
4a60: 6f 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oc);.    }else i
4a70: 66 28 20 69 53 76 70 74 3c 70 4d 61 70 2d 3e 6e  f( iSvpt<pMap->n
4a80: 53 76 70 74 20 29 7b 0a 20 20 20 20 20 20 69 66  Svpt ){.      if
4a90: 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
4aa0: 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
4ab0: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
4ac0: 20 20 20 20 66 6f 72 28 69 69 3d 70 4d 61 70 2d      for(ii=pMap-
4ad0: 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31 3b 20 69 69  >nRollback-1; ii
4ae0: 3e 3d 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53  >=pMap->aSvpt[iS
4af0: 76 70 74 5d 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  vpt]; ii--){.   
4b00: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4b10: 6e 74 72 79 20 2a 70 20 3d 20 26 70 4d 61 70 2d  ntry *p = &pMap-
4b20: 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69 69 5d 3b 0a  >aRollback[ii];.
4b30: 20 20 20 20 20 20 20 20 20 20 50 74 72 6d 61 70            Ptrmap
4b40: 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20  Entry *pEntry = 
4b50: 26 70 4d 61 70 2d 3e 61 50 74 72 5b 70 2d 3e 70  &pMap->aPtr[p->p
4b60: 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e 69 46 69 72  gno - pMap->iFir
4b70: 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  st];.          p
4b80: 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 20 3d 20  Entry->parent = 
4b90: 70 2d 3e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20  p->parent;.     
4ba0: 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 65 54 79       pEntry->eTy
4bb0: 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20  pe = p->eType;. 
4bc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4bd0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 53 76  .      pMap->nSv
4be0: 70 74 20 3d 20 69 53 76 70 74 20 2b 20 28 6f 70  pt = iSvpt + (op
4bf0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
4c00: 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 70 4d 61  BACK);.      pMa
4c10: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3d 20 70  p->nRollback = p
4c20: 4d 61 70 2d 3e 61 53 76 70 74 5b 69 53 76 70 74  Map->aSvpt[iSvpt
4c30: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  ];.    }.  }.}..
4c40: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
4c50: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
4c60: 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  NT).**.** This f
4c70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4c80: 64 20 61 66 74 65 72 20 61 6e 20 43 4f 4e 43 55  d after an CONCU
4c90: 52 52 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f  RRENT transactio
4ca0: 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  n is opened on t
4cb0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
4cc0: 49 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  It allocates the
4cd0: 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74 72   BtreePtrmap str
4ce0: 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 74  ucture used to t
4cf0: 72 61 63 6b 20 70 6f 69 6e 74 65 72 73 0a 2a 2a  rack pointers.**
4d00: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   to allocated pa
4d10: 67 65 73 20 61 6e 64 20 7a 65 72 6f 65 73 20 74  ges and zeroes t
4d20: 68 65 20 6e 46 72 65 65 2f 69 54 72 75 6e 6b 20  he nFree/iTrunk 
4d30: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 64 61  fields in the da
4d40: 74 61 62 61 73 65 20 0a 2a 2a 20 68 65 61 64 65  tabase .** heade
4d50: 72 20 6f 6e 20 70 61 67 65 20 31 2e 0a 2a 2f 0a  r on page 1..*/.
4d60: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4d70: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 42  PtrmapAllocate(B
4d80: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
4d90: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4da0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  _OK;.  if( pBt->
4db0: 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 42  pMap==0 ){.    B
4dc0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
4dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
4de0: 63 28 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74  c(sizeof(BtreePt
4df0: 72 6d 61 70 29 29 3b 0a 20 20 20 20 69 66 28 20  rmap));.    if( 
4e00: 70 4d 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMap==0 ){.     
4e10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4e20: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
4e30: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42 74       memset(&pBt
4e40: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
4e50: 33 32 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  32], 0, sizeof(u
4e60: 33 32 29 2a 32 29 3b 0a 20 20 20 20 20 20 6d 65  32)*2);.      me
4e70: 6d 73 65 74 28 70 4d 61 70 2c 20 30 2c 20 73 69  mset(pMap, 0, si
4e80: 7a 65 6f 66 28 42 74 72 65 65 50 74 72 6d 61 70  zeof(BtreePtrmap
4e90: 29 29 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e  ));.      pMap->
4ea0: 69 46 69 72 73 74 20 3d 20 70 42 74 2d 3e 6e 50  iFirst = pBt->nP
4eb0: 61 67 65 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  age + 1;.      p
4ec0: 42 74 2d 3e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  Bt->pMap = pMap;
4ed0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4ee0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64  urn rc;.}../* !d
4ef0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4f00: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
4f10: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 42 74  *.** Free any Bt
4f20: 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74  reePtrmap struct
4f30: 75 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ure allocated by
4f40: 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
4f50: 20 74 6f 0a 2a 2a 20 62 74 72 65 65 50 74 72 6d   to.** btreePtrm
4f60: 61 70 41 6c 6c 6f 63 61 74 65 28 29 2e 0a 2a 2f  apAllocate()..*/
4f70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4f80: 65 65 50 74 72 6d 61 70 44 65 6c 65 74 65 28 42  eePtrmapDelete(B
4f90: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
4fa0: 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d   BtreePtrmap *pM
4fb0: 61 70 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a  ap = pBt->pMap;.
4fc0: 20 20 69 66 28 20 70 4d 61 70 20 29 7b 0a 20 20    if( pMap ){.  
4fd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4fe0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 29 3b  Map->aRollback);
4ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5000: 65 28 70 4d 61 70 2d 3e 61 50 74 72 29 3b 0a 20  e(pMap->aPtr);. 
5010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5020: 70 4d 61 70 2d 3e 61 53 76 70 74 29 3b 0a 20 20  pMap->aSvpt);.  
5030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5040: 4d 61 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Map);.    pBt->p
5050: 4d 61 70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  Map = 0;.  }.}.#
5060: 65 6c 73 65 20 20 2f 2a 20 53 51 4c 49 54 45 5f  else  /* SQLITE_
5070: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 20  OMIT_CONCURRENT 
5080: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65  */.# define btre
5090: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
50a0: 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  x) SQLITE_OK.# d
50b0: 65 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61  efine btreePtrma
50c0: 70 44 65 6c 65 74 65 28 78 29 20 0a 23 20 64 65  pDelete(x) .# de
50d0: 66 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70  fine btreePtrmap
50e0: 42 65 67 69 6e 28 78 2c 79 29 20 20 53 51 4c 49  Begin(x,y)  SQLI
50f0: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 62  TE_OK.# define b
5100: 74 72 65 65 50 74 72 6d 61 70 45 6e 64 28 78 2c  treePtrmapEnd(x,
5110: 79 2c 7a 29 20 0a 23 65 6e 64 69 66 20 2f 2a 20  y,z) .#endif /* 
5120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
5130: 55 52 52 45 4e 54 20 2a 2f 0a 0a 73 74 61 74 69  URRENT */..stati
5140: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
5150: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
5160: 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20  e);  /* Forward 
5170: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
5180: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
5190: 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65 20  PageOne(MemPage 
51a0: 2a 70 50 61 67 65 29 3b 20 20 20 20 20 20 2f 2a  *pPage);      /*
51b0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
51c0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
51d0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  d releasePageNot
51e0: 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Null(MemPage *pP
51f0: 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  age);  /* Forwar
5200: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a  d reference */..
5210: 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f  /*.***** This ro
5220: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
5230: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
5240: 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a   only ****.**.**
5250: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
5260: 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68   cursor holds th
5270: 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42  e mutex on its B
5280: 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65  tShared.*/.#ifde
5290: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
52a0: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
52b0: 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72  HoldsMutex(BtCur
52c0: 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  sor *p){.  retur
52d0: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
52e0: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
52f0: 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66  ex);.}../* Verif
5300: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
5310: 72 20 61 6e 64 20 74 68 65 20 42 74 53 68 61 72  r and the BtShar
5320: 65 64 20 61 67 72 65 65 20 61 62 6f 75 74 20 77  ed agree about w
5330: 68 61 74 20 69 73 20 74 68 65 20 63 75 72 72 65  hat is the curre
5340: 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  nt.** database c
5350: 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20 69  onnetion. This i
5360: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 73  s important in s
5370: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
5380: 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  . If the databas
5390: 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  e .** connection
53a0: 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f 75   pointers get ou
53b0: 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69 73  t-of-sync, it is
53c0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 6f   possible for ro
53d0: 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20 62  utines like.** b
53e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74  treeInitPage() t
53f0: 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20 73  o reference an s
5400: 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tale connection 
5410: 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65 66  pointer that ref
5420: 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20 63  erences a.** a c
5430: 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68  onnection that h
5440: 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 65  as already close
5450: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
5460: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
5470: 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74  assert().** stat
5480: 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64 20  ements only and 
5490: 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20  for the purpose 
54a0: 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 69  of double-checki
54b0: 6e 67 20 74 68 61 74 20 74 68 65 20 62 74 72 65  ng that the btre
54c0: 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20 6b  e code.** does k
54d0: 65 65 70 20 74 68 65 20 64 61 74 61 62 61 73 65  eep the database
54e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
54f0: 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ters up-to-date.
5500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5510: 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
5520: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  d(BtCursor *p){.
5530: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
5540: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
5550: 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42  .  return (p->pB
5560: 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74  tree->db==p->pBt
5570: 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->db);.}.#endif.
5580: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
5590: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
55a0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
55b0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
55c0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
55d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
55e0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
55f0: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
5600: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
5610: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
5620: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
5630: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
5640: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
5650: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
5660: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
5670: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
5680: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
5690: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
56a0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
56b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
56c0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
56d0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
56e0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
56f0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5700: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5710: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5720: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
5730: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
5740: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5750: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
5760: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
5770: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5780: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
5790: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
57a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
57b0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
57c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
57d0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
57e0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
57f0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
5800: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
5810: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
5820: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
5830: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
5840: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
5850: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
5860: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
5870: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
5880: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
5890: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
58a0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
58b0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
58c0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
58d0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
58e0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
58f0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5900: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
5910: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
5920: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
5930: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
5940: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
5950: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
5960: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
5970: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
5980: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
5990: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
59a0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
59b0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
59c0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
59d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59e0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
59f0: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
5a00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
5a10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
5a20: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
5a30: 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  eck */.  Pgno pg
5a40: 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  noRoot,         
5a50: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
5a60: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
5a70: 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69 52  ging */.  i64 iR
5a80: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
5a90: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
5aa0: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
5ab0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
5ac0: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
5ad0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
5ae0: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
5af0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
5b00: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5b10: 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49  if( pBtree->hasI
5b20: 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20  ncrblobCur==0 ) 
5b30: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
5b40: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
5b50: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
5b60: 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61   );.  pBtree->ha
5b70: 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30  sIncrblobCur = 0
5b80: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
5b90: 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
5ba0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5bb0: 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46      if( (p->curF
5bc0: 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72  lags & BTCF_Incr
5bd0: 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  blob)!=0 ){.    
5be0: 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63    pBtree->hasInc
5bf0: 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20  rblobCur = 1;.  
5c00: 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
5c10: 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26 26  oot==pgnoRoot &&
5c20: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
5c30: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
5c40: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 20  iRow) ){.       
5c50: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
5c60: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
5c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5c80: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
5c90: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
5ca0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
5cb0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
5cc0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
5cd0: 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c 79  lobCursors(w,x,y
5ce0: 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,z).#endif /* SQ
5cf0: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
5d00: 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OB */../*.** Set
5d10: 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65   bit pgno of the
5d20: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
5d30: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68  ntent bitvec. Th
5d40: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a  is is called .**
5d50: 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61   when a page tha
5d60: 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e  t previously con
5d70: 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f  tained data beco
5d80: 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20  mes a free-list 
5d90: 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a  leaf .** page..*
5da0: 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65  *.** The BtShare
5db0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
5dc0: 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77  tvec exists to w
5dd0: 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62  ork around an ob
5de0: 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75  scure.** bug cau
5df0: 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72  sed by the inter
5e00: 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73  action of two us
5e10: 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61  eful IO optimiza
5e20: 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e  tions surroundin
5e30: 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c  g.** free-list l
5e40: 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a  eaf pages:.**.**
5e50: 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64     1) When all d
5e60: 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66  ata is deleted f
5e70: 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74  rom a page and t
5e80: 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  he page becomes.
5e90: 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c  **      a free-l
5ea0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
5eb0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77  he page is not w
5ec0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
5ed0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28  tabase.**      (
5ee0: 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  as free-list lea
5ef0: 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20  f pages contain 
5f00: 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61  no meaningful da
5f10: 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a  ta). Sometimes.*
5f20: 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61  *      such a pa
5f30: 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a  ge is not even j
5f40: 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74  ournalled (as it
5f50: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64   will not be mod
5f60: 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77  ified,.**      w
5f70: 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61  hy bother journa
5f80: 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a  lling it?)..**.*
5f90: 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72  *   2) When a fr
5fa0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
5fb0: 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73  e is reused, its
5fc0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
5fd0: 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
5fe0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  m the database o
5ff0: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  r written to the
6000: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77   journal file (w
6010: 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20  hy should it.** 
6020: 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69       be, if it i
6030: 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61  s not at all mea
6040: 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a  ningful?)..**.**
6050: 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20   By themselves, 
6060: 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  these optimizati
6070: 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e  ons work fine an
6080: 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64  d provide a hand
6090: 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  y.** performance
60a0: 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64   boost to bulk d
60b0: 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20  elete or insert 
60c0: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65  operations. Howe
60d0: 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67  ver, if.** a pag
60e0: 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  e is moved to th
60f0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
6100: 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68  then reused with
6110: 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  in the same.** t
6120: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72  ransaction, a pr
6130: 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20  oblem comes up. 
6140: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
6150: 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68  ot journalled wh
6160: 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65  en.** it is move
6170: 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
6180: 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73  st and it is als
6190: 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64  o not journalled
61a0: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65   when it.** is e
61b0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
61c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
61d0: 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65  reused, then the
61e0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a   original data.*
61f0: 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49  * may be lost. I
6200: 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
6210: 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61   rollback, it ma
6220: 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  y not be possibl
6230: 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  e.** to restore 
6240: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
6250: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
6260: 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  figuration..**.*
6270: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
6280: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  s the BtShared.p
6290: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
62a0: 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61  c. Whenever a pa
62b0: 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20  ge is .** moved 
62c0: 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65  to become a free
62d0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
62e0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
62f0: 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74  ng bit is.** set
6300: 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20   in the bitvec. 
6310: 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20  Whenever a leaf 
6320: 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65  page is extracte
6330: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
6340: 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a  list,.** optimiz
6350: 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73  ation 2 above is
6360: 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20   omitted if the 
6370: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
6380: 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  t is already.** 
6390: 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e  set in BtShared.
63a0: 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65  pHasContent. The
63b0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
63c0: 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61   bitvec are clea
63d0: 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  red.** at the en
63e0: 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73  d of every trans
63f0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
6400: 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61  c int btreeSetHa
6410: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
6420: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
6430: 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  o){.  int rc = S
6440: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
6450: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
6460: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6470: 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67   pgno<=pBt->nPag
6480: 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48  e );.    pBt->pH
6490: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69  asContent = sqli
64a0: 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
64b0: 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
64c0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
64d0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
64e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
64f0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
6500: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
6510: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
6520: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
6530: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
6540: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
6550: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
6560: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
6570: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
6580: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6590: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
65a0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
65b0: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
65c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
65d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
65e0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
65f0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
6600: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
6610: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
6620: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
6630: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
6640: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
6650: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
6660: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
6670: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
6680: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
6690: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
66a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
66b0: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
66c0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
66d0: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
66e0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
66f0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
6700: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
6710: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
6720: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
6730: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
6740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
6750: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
6760: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6770: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
6780: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
6790: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
67a0: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
67b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
67c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
67d0: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
67e0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
67f0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
6800: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
6810: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
6820: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
6830: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
6840: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66  * Release all of
6850: 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61   the apPage[] pa
6860: 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72  ges for a cursor
6870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6880: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6890: 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75  CursorPages(BtCu
68a0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
68b0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43 75 72  nt i;.  if( pCur
68c0: 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
68d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
68e0: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
68f0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
6900: 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
6910: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
6920: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
6930: 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50  NotNull(pCur->pP
6940: 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age);.    pCur->
6950: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a  iPage = -1;.  }.
6960: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
6970: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
6980: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
6990: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
69a0: 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77  valid entry.** w
69b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
69c0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65  n is called (i.e
69d0: 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43  . have eState==C
69e0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68  URSOR_VALID). Th
69f0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
6a00: 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  aves the current
6a10: 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76   cursor key in v
6a20: 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e  ariables pCur->n
6a30: 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d  Key and.** pCur-
6a40: 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b  >pKey. SQLITE_OK
6a50: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6a60: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e  successful or an
6a70: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a   SQLite error .*
6a80: 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
6a90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
6aa0: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
6ab0: 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
6ac0: 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67  , then the integ
6ad0: 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72  er key.** (the r
6ae0: 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64 20  owid) is stored 
6af0: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e  in pCur->nKey an
6b00: 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20  d pCur->pKey is 
6b10: 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e  left set to.** N
6b20: 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73  ULL. If the curs
6b30: 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20  or is open on a 
6b40: 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65  non-intkey table
6b50: 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65  , then pCur->pKe
6b60: 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20  y is .** set to 
6b70: 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f  point to a mallo
6b80: 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72 2d  ced buffer pCur-
6b90: 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73  >nKey bytes in s
6ba0: 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a  ize containing .
6bb0: 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73  ** the key..*/.s
6bc0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
6bd0: 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72  rsorKey(BtCursor
6be0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6c00: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
6c10: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
6c20: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
6c30: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
6c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6c50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
6c60: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
6c70: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a  r->curIntKey ){.
6c80: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20      /* Only the 
6c90: 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72 65  rowid is require
6ca0: 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74  d for a table bt
6cb0: 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  ree */.    pCur-
6cc0: 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  >nKey = sqlite3B
6cd0: 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70  treeIntegerKey(p
6ce0: 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
6cf0: 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64     /* For an ind
6d00: 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20 74  ex btree, save t
6d10: 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79 20  he complete key 
6d20: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 76  content */.    v
6d30: 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 70  oid *pKey;.    p
6d40: 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69  Cur->nKey = sqli
6d50: 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
6d60: 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ize(pCur);.    p
6d70: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
6d80: 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20  loc( pCur->nKey 
6d90: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
6da0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6db0: 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
6dc0: 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  d(pCur, 0, (int)
6dd0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
6de0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
6df0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6e00: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
6e10: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
6e20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6e30: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
6e40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6e50: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
6e60: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
6e70: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  T;.    }.  }.  a
6e80: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75  ssert( !pCur->cu
6e90: 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  rIntKey || !pCur
6ea0: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75  ->pKey );.  retu
6eb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6ec0: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
6ed0: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
6ee0: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
6ef0: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
6f00: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
6f10: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
6f20: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
6f30: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
6f40: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
6f50: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
6f60: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
6f70: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
6f80: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
6f90: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
6fa0: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
6fb0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
6fc0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
6fd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6fe0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6ff0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
7000: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
7010: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c  ==pCur->eState |
7020: 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  | CURSOR_SKIPNEX
7030: 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  T==pCur->eState 
7040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
7050: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
7060: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
7070: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
7080: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
7090: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
70a0: 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43  IPNEXT ){.    pC
70b0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
70c0: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
70d0: 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b  se{.    pCur->sk
70e0: 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ipNext = 0;.  }.
70f0: 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  .  rc = saveCurs
7100: 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69  orKey(pCur);.  i
7110: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7120: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
7130: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
7140: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
7150: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
7160: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
7170: 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75  .  }..  pCur->cu
7180: 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
7190: 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
71a0: 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41  ValidOvfl|BTCF_A
71b0: 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  tLast);.  return
71c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
71d0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
71e0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
71f0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
7200: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43  ursorsOnList(BtC
7210: 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75  ursor*,Pgno,BtCu
7220: 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  rsor*);../*.** S
7230: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
7240: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
7250: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
7260: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
7270: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
7280: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
7290: 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74  Root.  "Saving t
72a0: 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  he cursor positi
72b0: 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a  on" means that.*
72c0: 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69  * the location i
72d0: 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72  n the btree is r
72e0: 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63  emembered in suc
72f0: 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20  h a way that it 
7300: 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20  can be.** moved 
7310: 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65  back to the same
7320: 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20   spot after the 
7330: 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d  btree has been m
7340: 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a  odified.  This.*
7350: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
7360: 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
7370: 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69  cursor pExcept i
7380: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
7390: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66   the.** table, f
73a0: 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74  or example in Bt
73b0: 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
73c0: 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a  treeInsert()..**
73d0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
73e0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
73f0: 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
7400: 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
7410: 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72   such .** cursor
7420: 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68  s should have th
7430: 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  eir BTCF_Multipl
7440: 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65  e flag set.  The
7450: 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a   btreeCursor().*
7460: 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63  * routine enforc
7470: 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54  es that rule.  T
7480: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
7490: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c   needs to be cal
74a0: 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  led in.** the un
74b0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e  common case when
74c0: 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65   pExpect has the
74d0: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
74e0: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
74f0: 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20  f pExpect!=NULL 
7500: 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  and if no other 
7510: 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e  cursors are foun
7520: 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f  d on the same ro
7530: 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e  ot-page,.** then
7540: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
7550: 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65  le flag on pExpe
7560: 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74  ct is cleared, t
7570: 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a  o avoid another.
7580: 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c  ** pointless cal
7590: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
75a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  e..**.** Impleme
75b0: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
75c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
75d0: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
75e0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
75f0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
7600: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
7610: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
7620: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
7630: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
7640: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
7650: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
7660: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
7670: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
7680: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
7690: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
76a0: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
76b0: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
76c0: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
76d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
76e0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
76f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
7700: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
7710: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
7720: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
7730: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
7740: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7750: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
7760: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
7770: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
7780: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
7790: 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65   p ) return save
77a0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c  CursorsOnList(p,
77b0: 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29   iRoot, pExcept)
77c0: 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20  ;.  if( pExcept 
77d0: 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c  ) pExcept->curFl
77e0: 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c  ags &= ~BTCF_Mul
77f0: 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  tiple;.  return 
7800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7810: 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75   This helper rou
7820: 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43  tine to saveAllC
7830: 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20  ursors does the 
7840: 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73  actual work of s
7850: 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72  aving.** the cur
7860: 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e  sors if and when
7870: 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75   a cursor is fou
7880: 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79  nd that actually
7890: 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67   requires saving
78a0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20  ..** The common 
78b0: 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20  case is that no 
78c0: 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20  cursors need to 
78d0: 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69  be saved, so thi
78e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
78f0: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20  broken out from 
7900: 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76  its caller to av
7910: 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
7920: 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f  stack pointer mo
7930: 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  vement..*/.stati
7940: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
7950: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
7960: 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72  sOnList(.  BtCur
7970: 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  sor *p,         
7980: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72  /* The first cur
7990: 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73  sor that needs s
79a0: 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  aving */.  Pgno 
79b0: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
79c0: 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72  /* Only save cur
79d0: 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52  sor with this iR
79e0: 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66  oot. Save all if
79f0: 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72   zero */.  BtCur
7a00: 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20  sor *pExcept    
7a10: 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74  /* Do not save t
7a20: 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  his cursor */.){
7a30: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
7a40: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
7a50: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
7a60: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b  oRoot==iRoot) ){
7a70: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53  .      if( p->eS
7a80: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
7a90: 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
7aa0: 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
7ab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
7ac0: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
7ad0: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
7ae0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7af0: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20  K!=rc ){.       
7b00: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7b20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
7b30: 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e  tcase( p->iPage>
7b40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  =0 );.        bt
7b50: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
7b60: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
7b70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
7b80: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
7b90: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
7ba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
7bc0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
7bd0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
7be0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7bf0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
7c00: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
7c10: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
7c20: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
7c30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7c40: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
7c50: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
7c60: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
7c70: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
7c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
7c90: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
7ca0: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
7cb0: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
7cc0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
7cd0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
7ce0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
7cf0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
7d00: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
7d10: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
7d20: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
7d30: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
7d40: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
7d50: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
7d60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
7d70: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
7d80: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
7d90: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
7da0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
7db0: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
7dc0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
7dd0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
7de0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
7e00: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
7e10: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
7e20: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
7e30: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
7e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
7e50: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
7e60: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
7e70: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
7e80: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
7e90: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
7ea0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
7ed0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
7ee0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
7ef0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
7f00: 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20  x key */..  if( 
7f10: 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
7f20: 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
7f30: 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
7f40: 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
7f50: 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
7f60: 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70  edRecord(pCur->p
7f70: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
7f80: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
7f90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
7fa0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c  EM_BKPT;.    sql
7fb0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
7fc0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
7fd0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
7fe0: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
7ff0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
8000: 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20  >nField==0 ){.  
8010: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8020: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8030: 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
8040: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  done;.    }.  }e
8050: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
8060: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
8070: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
8080: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
8090: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
80a0: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f   bias, pRes);.mo
80b0: 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28  veto_done:.  if(
80c0: 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
80d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
80e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
80f0: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  , pIdxKey);.  }.
8100: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8110: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
8120: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
8130: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
8140: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
8150: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
8160: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
8170: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
8180: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
8190: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
81a0: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
81b0: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
81c0: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
81d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
81e0: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
81f0: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
8200: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
8210: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8220: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
8230: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
8240: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73  Position()..*/.s
8250: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
8260: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
8270: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
8280: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
8290: 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a    int skipNext;.
82a0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
82b0: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
82c0: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
82d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
82e0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
82f0: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
8300: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
8310: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
8320: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
8330: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
8340: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
8350: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
8360: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
8370: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
8380: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69  r->nKey, 0, &ski
8390: 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63  pNext);.  if( rc
83a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
83b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
83c0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
83d0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
83e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
83f0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
8400: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
8410: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
8420: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70  INVALID );.    p
8430: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d  Cur->skipNext |=
8440: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
8450: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
8460: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
8470: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
8480: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
8490: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
84a0: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
84b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
84c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
84d0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
84e0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
84f0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
8500: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
8510: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
8520: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
8530: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
8540: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
8550: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
8560: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
8570: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
8580: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
8590: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
85a0: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
85b0: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
85c0: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
85d0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
85e0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
85f0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
8600: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
8610: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
8620: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
8630: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
8640: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
8650: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
8660: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
8670: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
8680: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8690: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
86a0: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
86b0: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
86c0: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
86d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
86e0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
86f0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
8700: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
8710: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
8720: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
8730: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
8740: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
8750: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
8760: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
8770: 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
8780: 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  rn pCur->eState!
8790: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
87a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
87b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61   pointer to a fa
87c0: 6b 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  ke BtCursor obje
87d0: 63 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77  ct that will alw
87e0: 61 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61  ays answer.** fa
87f0: 6c 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74  lse to the sqlit
8800: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
8810: 4d 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20  Moved() routine 
8820: 61 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65  above.  The fake
8830: 0a 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72  .** cursor retur
8840: 6e 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ned must not be 
8850: 75 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  used with any ot
8860: 68 65 72 20 42 74 72 65 65 20 69 6e 74 65 72 66  her Btree interf
8870: 61 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72  ace..*/.BtCursor
8880: 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 61   *sqlite3BtreeFa
8890: 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f  keValidCursor(vo
88a0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38  id){.  static u8
88b0: 20 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55   fakeCursor = CU
88c0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73  RSOR_VALID;.  as
88d0: 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42  sert( offsetof(B
88e0: 74 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29  tCursor, eState)
88f0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
8900: 28 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65  (BtCursor*)&fake
8910: 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cursor;.}../*.**
8920: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
8930: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
8940: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
8950: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
8960: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
8970: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
8980: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
8990: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
89a0: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
89b0: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
89c0: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
89d0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
89e0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
89f0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
8a00: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
8a10: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
8a20: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
8a30: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
8a40: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
8a50: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
8a60: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
8a70: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
8a80: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
8a90: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
8aa0: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
8ab0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
8ac0: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
8ad0: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
8ae0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
8af0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
8b00: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
8b10: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
8b20: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
8b30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
8b40: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
8b50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
8b60: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
8b70: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
8b80: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
8b90: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
8ba0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
8bb0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8bc0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
8bd0: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
8be0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
8bf0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
8c00: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
8c10: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
8c20: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
8c30: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
8c40: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
8c50: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
8c60: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
8c70: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
8c80: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
8c90: 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  kipNext==0 );.  
8ca0: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
8cb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
8cc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8cd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8ce0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8cf0: 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  TS./*.** Provide
8d00: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
8d10: 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69  rsor.  The parti
8d20: 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e  cular hint given
8d30: 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a   (and the type.*
8d40: 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  * and number of 
8d50: 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61  the varargs para
8d60: 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72  meters) is deter
8d70: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69  mined by the eHi
8d80: 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65  ntType.** parame
8d90: 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65  ter.  See the de
8da0: 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  finitions of the
8db0: 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61   BTREE_HINT_* ma
8dc0: 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73  cros for details
8dd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8de0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
8df0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
8e00: 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20   int eHintType, 
8e10: 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20  ...){.  /* Used 
8e20: 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74  only by system t
8e30: 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74  hat substitute t
8e40: 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65  heir own storage
8e50: 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e   engine */.}.#en
8e60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  dif../*.** Provi
8e70: 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f  de flag hints to
8e80: 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
8e90: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
8ea0: 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73  eCursorHintFlags
8eb0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
8ec0: 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20   unsigned x){.  
8ed0: 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45  assert( x==BTREE
8ee0: 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42  _SEEK_EQ || x==B
8ef0: 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c  TREE_BULKLOAD ||
8f00: 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d   x==0 );.  pCur-
8f10: 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a  >hints = x;.}...
8f20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8f30: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
8f40: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
8f50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
8f60: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
8f70: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
8f80: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
8f90: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
8fa0: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
8fb0: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
8fc0: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
8fd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
8fe0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f  .** Return 0 (no
8ff0: 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20  t a valid page) 
9000: 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63  for pgno==1 sinc
9010: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  e there is.** no
9020: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73   pointer map ass
9030: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
9040: 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72  e 1.  The integr
9050: 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a  ity_check logic.
9060: 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ** requires that
9070: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c   ptrmapPageno(*,
9080: 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  1)!=1..*/.static
9090: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
90a0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
90b0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
90c0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
90d0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
90e0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
90f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9100: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
9110: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
9120: 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o<2 ) return 0;.
9130: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
9140: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
9150: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
9160: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
9170: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
9180: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
9190: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
91a0: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
91b0: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
91c0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
91d0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
91e0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
91f0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
9200: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
9210: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
9220: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
9230: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
9240: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
9250: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
9260: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
9270: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
9280: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
9290: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
92a0: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
92b0: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
92c0: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
92d0: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
92e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
92f0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
9300: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
9310: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
9320: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
9330: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
9340: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
9350: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
9360: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9370: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
9380: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
9390: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
93a0: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
93b0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
93c0: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
93d0: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
93e0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
93f0: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
9400: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
9410: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
9420: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
9430: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
9440: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
9450: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
9460: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9470: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
9480: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
9490: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
94a0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
94b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
94c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
94d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
94e0: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
94f0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
9500: 73 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f  s never added to
9510: 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
9520: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
9530: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
9540: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
9550: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
9560: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
9570: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
9580: 54 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 4d 61  T.  if( pBt->pMa
9590: 70 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  p ){.    *pRC = 
95a0: 62 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65  btreePtrmapStore
95b0: 28 70 42 74 2c 20 6b 65 79 2c 20 65 54 79 70 65  (pBt, key, eType
95c0: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 72  , parent);.    r
95d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
95e0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  f..  assert( pBt
95f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
9600: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
9610: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
9620: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9630: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9640: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
9650: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
9660: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
9670: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
9680: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
9690: 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a  , &pDbPage, 0);.
96a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
96b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
96c0: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
96d0: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
96e0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
96f0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
9700: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
9710: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
9720: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9730: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d  T;.    goto ptrm
9740: 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61  ap_exit;.  }.  a
9750: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
9760: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
9770: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74  eSize-5 );.  pPt
9780: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
9790: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
97a0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
97b0: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
97c0: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
97d0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
97e0: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
97f0: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
9800: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
9810: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
9820: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
9830: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
9840: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9850: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
9860: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9870: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
9880: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
9890: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
98a0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
98b0: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
98c0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
98d0: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
98e0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
98f0: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
9900: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
9910: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
9920: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
9930: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
9940: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
9950: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
9960: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
9970: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
9980: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
9990: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
99a0: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
99b0: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
99c0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
99d0: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
99e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
99f0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
9a00: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
9a10: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
9a20: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9a30: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
9a40: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
9a50: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
9a60: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
9a70: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
9a80: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
9a90: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
9aa0: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
9ab0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
9ac0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9ad0: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
9ae0: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
9af0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9b00: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
9b10: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
9b20: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
9b30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9b40: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
9b50: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
9b60: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
9b70: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
9b80: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
9b90: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
9ba0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20  rmap, &pDbPage, 
9bb0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  0);.  if( rc!=0 
9bc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9bd0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
9be0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
9bf0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
9c00: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
9c10: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
9c20: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
9c30: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
9c40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
9c50: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
9c60: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
9c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9c80: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
9c90: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
9ca0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
9cb0: 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -5 );.  assert( 
9cc0: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
9cd0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
9ce0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
9cf0: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
9d00: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
9d10: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
9d20: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
9d30: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
9d40: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
9d50: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
9d60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9d70: 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29  PT_PGNO(iPtrmap)
9d80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9d90: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
9da0: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
9db0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9dc0: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
9dd0: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
9de0: 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65  ,z,rc).  #define
9df0: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
9e00: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
9e10: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
9e20: 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72  tOvflPtr(x, y, r
9e30: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
9e40: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
9e50: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
9e60: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
9e70: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
9e80: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
9e90: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
9ea0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
9eb0: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
9ec0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
9ed0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
9ee0: 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ** findCellPastP
9ef0: 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61  tr() does the sa
9f00: 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69  me except it ski
9f10: 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74  ps past the init
9f20: 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68  ial.** 4-byte ch
9f30: 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e  ild pointer foun
9f40: 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  d on interior pa
9f50: 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73  ges, if there is
9f60: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   one..**.** This
9f70: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
9f80: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
9f90: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
9fa0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
9fb0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
9fc0: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
9fd0: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
9fe0: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
9ff0: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
a000: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
a010: 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66  I)]))).#define f
a020: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50  indCellPastPtr(P
a030: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
a040: 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e  ataOfst + ((P)->
a050: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
a060: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
a070: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
a080: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
a090: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20   is common tail 
a0a0: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62  processing for b
a0b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
a0c0: 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50  () and.** btreeP
a0d0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
a0e0: 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  () for the case 
a0f0: 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f  when the cell do
a100: 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72  es not fit entir
a110: 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67  ely.** on a sing
a120: 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20  le B-tree page. 
a130: 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20   Make necessary 
a140: 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74  adjustments to t
a150: 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73  he CellInfo.** s
a160: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
a170: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
a180: 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61  INE void btreePa
a190: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
a1a0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20  eForOverflow(.  
a1b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a1c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a1d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a1e0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a1f0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a200: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a210: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a220: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a230: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a240: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a250: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ture */.){.  /* 
a260: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
a270: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
a280: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
a290: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
a2a0: 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65  e.  ** to decide
a2b0: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
a2c0: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
a2d0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
a2e0: 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66   onto.  ** overf
a2f0: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
a300: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
a310: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
a320: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a  nt of unused.  *
a330: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
a340: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
a350: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
a360: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
a370: 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77  age.  ** in betw
a380: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
a390: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a   maxLocal..  **.
a3a0: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
a3b0: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
a3c0: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
a3d0: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
a3e0: 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20  in any.  ** way 
a3f0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
a400: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
a410: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f  ile format..  */
a420: 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b  .  int minLocal;
a430: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
a440: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
a450: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
a460: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
a470: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
a480: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
a490: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
a4a0: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
a4b0: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
a4c0: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
a4d0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
a4e0: 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ..  minLocal = p
a4f0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a500: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
a510: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
a520: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
a530: 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  al + (pInfo->nPa
a540: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
a550: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
a560: 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20  sableSize-4);.  
a570: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
a580: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
a590: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
a5a0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
a5b0: 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20  ;.  if( surplus 
a5c0: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
a5d0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
a5e0: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
a5f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
a600: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a610: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  16)minLocal;.  }
a620: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
a630: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
a640: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
a650: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
a660: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
a670: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a680: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
a690: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
a6a0: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
a6b0: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
a6c0: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
a6d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
a6e0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
a6f0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
a700: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
a710: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
a720: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
a730: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
a740: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
a750: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
a760: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
a770: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
a780: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
a790: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
a7a0: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
a7b0: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
a7c0: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
a7d0: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
a7e0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
a7f0: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
a800: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
a810: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
a820: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
a830: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
a840: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
a850: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
a860: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
a870: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
a880: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a890: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a8a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a8b0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a8c0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a8d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a8e0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a8f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a900: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a910: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a920: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
a930: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a940: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a950: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a960: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
a970: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
a980: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a990: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69  PtrSize==4 );.#i
a9a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
a9b0: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
a9c0: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a9d0: 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  ndif.  pInfo->nS
a9e0: 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72  ize = 4 + getVar
a9f0: 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28  int(&pCell[4], (
aa00: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
aa10: 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  y);.  pInfo->nPa
aa20: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e  yload = 0;.  pIn
aa30: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a  fo->nLocal = 0;.
aa40: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
aa50: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
aa60: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
aa70: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
aa80: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
aa90: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
aaa0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
aab0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
aac0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
aad0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
aae0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
aaf0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
ab00: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
ab10: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
ab20: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
ab30: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
ab40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
ab50: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
ab60: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
ab70: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
ab80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ab90: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
aba0: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
abb0: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
abc0: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
abd0: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
abe0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
abf0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ac00: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ac10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ac20: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
ac30: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
ac40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ac50: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20  >intKeyLeaf );. 
ac60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ac70: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
ac80: 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65  );.  pIter = pCe
ac90: 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ll;..  /* The ne
aca0: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
acb0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
acc0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
acd0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
ace0: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61  int32(pIter, nPa
acf0: 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a  yload);.  **.  *
ad00: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
ad10: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
ad20: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
ad30: 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20    */.  nPayload 
ad40: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
ad50: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
ad60: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
ad70: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
ad80: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
ad90: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
ada0: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
adb0: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
adc0: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
add0: 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65    }while( (*pIte
ade0: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
adf0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
ae00: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  pIter++;..  /* T
ae10: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
ae20: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
ae30: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
ae40: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
ae50: 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20  etVarint(pIter, 
ae60: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
ae70: 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ey);.  **.  ** T
ae80: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
ae90: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
aea0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
aeb0: 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65  /.  iKey = *pIte
aec0: 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30  r;.  if( iKey>=0
aed0: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
aee0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b  End = &pIter[7];
aef0: 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37  .    iKey &= 0x7
af00: 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  f;.    while(1){
af10: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69  .      iKey = (i
af20: 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  Key<<7) | (*++pI
af30: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
af40: 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c     if( (*pIter)<
af50: 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  0x80 ) break;.  
af60: 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70      if( pIter>=p
af70: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69  End ){.        i
af80: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20  Key = (iKey<<8) 
af90: 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20  | *++pIter;.    
afa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
afb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
afc0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f  Iter++;..  pInfo
afd0: 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29  ->nKey = *(i64*)
afe0: 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e  &iKey;.  pInfo->
aff0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
b000: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
b010: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
b020: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
b030: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
b040: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
b050: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
b060: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
b070: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
b080: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
b090: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
b0a0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
b0b0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
b0c0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
b0d0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
b0e0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
b0f0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
b100: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
b110: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
b120: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
b130: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
b140: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
b150: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
b160: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
b170: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
b180: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
b190: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
b1a0: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
b1b0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
b1c0: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
b1d0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
b1e0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
b1f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
b200: 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61  trIndex(.  MemPa
b210: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
b220: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
b230: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
b240: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
b250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b260: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
b270: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
b280: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
b290: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
b2a0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
b2b0: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  */.){.  u8 *pIte
b2c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
b2d0: 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20  /* For scanning 
b2e0: 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f  through pCell */
b2f0: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
b300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b310: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
b320: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
b330: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
b340: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b350: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b360: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b370: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
b380: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
b390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b3a0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  ge->intKeyLeaf==
b3b0: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
b3c0: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
b3d0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
b3e0: 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b  ayload = *pIter;
b3f0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e  .  if( nPayload>
b400: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
b410: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38  *pEnd = &pIter[8
b420: 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ];.    nPayload 
b430: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
b440: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
b450: 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20  = (nPayload<<7) 
b460: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
b470: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
b480: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
b490: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b4a0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
b4b0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
b4c0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
b4d0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
b4e0: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
b4f0: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
b500: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
b510: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
b520: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
b530: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
b540: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
b550: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
b560: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
b570: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
b580: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
b590: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
b5a0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
b5b0: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
b5c0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
b5d0: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
b5e0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
b5f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
b600: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
b610: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
b620: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
b630: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
b640: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
b650: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
b660: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
b670: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
b680: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
b690: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
b6a0: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
b6b0: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
b6c0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
b6d0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
b6e0: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
b6f0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
b700: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
b710: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
b720: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
b730: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
b740: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
b750: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
b760: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
b770: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
b780: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
b790: 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d  e */.){.  pPage-
b7a0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b7b0: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
b7c0: 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f  e, iCell), pInfo
b7d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
b7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
b7f0: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
b800: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
b810: 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a  mPage.xCellSize.
b820: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
b830: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
b840: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
b850: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
b860: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
b870: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
b880: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
b890: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
b8a0: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
b8b0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
b8c0: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
b8d0: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
b8e0: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
b8f0: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
b900: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
b910: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
b920: 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  **.** cellSizePt
b930: 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20  rNoPayload()    
b940: 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72  =>   table inter
b950: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c  nal nodes.** cel
b960: 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20  lSizePtr()      
b970: 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20         =>   all 
b980: 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61  index nodes & ta
b990: 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ble leaf nodes.*
b9a0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
b9b0: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
b9c0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
b9d0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
b9e0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
b9f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  ->childPtrSize; 
ba00: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
ba10: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
ba20: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
ba30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba50: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
ba60: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75   a varint */.  u
ba70: 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  32 nSize;       
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
baa0: 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
bab0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
bac0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
bad0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bae0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
baf0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
bb00: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
bb10: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
bb20: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
bb30: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
bb40: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
bb50: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
bb60: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
bb70: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
bb80: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
bb90: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
bba0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
bbb0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
bbc0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
bbd0: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
bbe0: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
bbf0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
bc00: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
bc10: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
bc20: 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20  ndif..  nSize = 
bc30: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
bc40: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
bc50: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
bc60: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
bc70: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
bc80: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
bc90: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
bca0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
bcb0: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
bcc0: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
bcd0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
bce0: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
bcf0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
bd00: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
bd10: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
bd20: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
bd30: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
bd40: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
bd50: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
bd60: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
bd70: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
bd80: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
bd90: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
bda0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bdb0: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
bdc0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
bdd0: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
bde0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
bdf0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
be00: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
be10: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
be20: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
be30: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
be40: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
be50: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
be60: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
be70: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
be80: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
be90: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
bea0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
beb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
bec0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
bed0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
bee0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
bef0: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
bf00: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
bf10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
bf20: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
bf30: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
bf40: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
bf50: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
bf60: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
bf70: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
bf80: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
bf90: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
bfa0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
bfb0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
bfc0: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
bfd0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
bfe0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
bff0: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
c000: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
c010: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
c020: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
c030: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
c040: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
c050: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
c060: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
c070: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
c080: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
c090: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
c0a0: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
c0b0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
c0c0: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
c0d0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
c0e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c0f0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
c100: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
c110: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
c120: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
c130: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
c140: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
c150: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
c160: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
c170: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
c180: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
c190: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
c1a0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
c1b0: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
c1c0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
c1d0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
c1e0: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
c1f0: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
c200: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
c210: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
c220: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
c230: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
c240: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
c250: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
c260: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
c270: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
c280: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
c290: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
c2a0: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
c2b0: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
c2c0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
c2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
c2e0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
c2f0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
c300: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
c310: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
c320: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
c330: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
c340: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
c350: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
c360: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
c370: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
c380: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
c390: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
c3a0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
c3b0: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
c3c0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
c3d0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
c3e0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
c3f0: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
c400: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
c410: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
c420: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
c430: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
c440: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
c450: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
c460: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
c470: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
c480: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
c490: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
c4a0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
c4b0: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
c4c0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
c4d0: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
c4e0: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
c4f0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
c500: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
c510: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
c520: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
c530: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
c540: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
c550: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
c560: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
c570: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
c580: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
c590: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
c5a0: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
c5b0: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53  e(&pCell[info.nS
c5c0: 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72  ize-4]);.    ptr
c5d0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
c5e0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
c5f0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
c600: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
c610: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
c620: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
c630: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68  e page given. Th
c640: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67  is routine reorg
c650: 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74  anizes cells wit
c660: 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hin the.** page 
c670: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
c680: 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73  e no free-blocks
c690: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f   on the free-blo
c6a0: 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50  ck list..**.** P
c6b0: 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61  arameter nMaxFra
c6c0: 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  g is the maximum
c6d0: 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d   amount of fragm
c6e0: 65 6e 74 65 64 20 73 70 61 63 65 20 74 68 61 74  ented space that
c6f0: 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65   may be.** prese
c700: 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 61  nt in the page a
c710: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
c720: 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  e returns..**.**
c730: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c740: 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69  44582-60138 SQLi
c750: 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65  te may from time
c760: 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e   to time reorgan
c770: 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20  ize a.** b-tree 
c780: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
c790: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c  re are no freebl
c7a0: 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74  ocks or fragment
c7b0: 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75   bytes, all.** u
c7c0: 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20  nused bytes are 
c7d0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
c7e0: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61   unallocated spa
c7f0: 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61  ce region, and a
c800: 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  ll.** cells are 
c810: 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61  packed tightly a
c820: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c830: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
c840: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
c850: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c860: 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67  ge, int nMaxFrag
c870: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
c8a0: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8c0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
c8d0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  e i-th cell */. 
c8e0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c900: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
c910: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
c920: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
c930: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c940: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
c950: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
c960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c970: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
c980: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
c990: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
c9a0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
c9b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
c9c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
c9d0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
c9e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c9f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
ca00: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ca10: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
ca20: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
ca30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ca40: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
ca50: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
ca60: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
ca70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
ca80: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
ca90: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
caa0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
cab0: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
cac0: 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ent */.  unsigne
cad0: 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20  d char *src;    
cae0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66      /* Source of
caf0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
cb00: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
cb10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
cb20: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
cb30: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
cb40: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
cb50: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
cb60: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
cb70: 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ex */..  assert(
cb80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
cb90: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
cba0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
cbb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
cbc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
cbd0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
cbe0: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
cbf0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
cc00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
cc10: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
cc20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cc30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cc40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
cc50: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
cc60: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
cc70: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
cc80: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
cc90: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
cca0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
ccb0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
ccc0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
ccd0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
cce0: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
ccf0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
cd00: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
cd10: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
cd20: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
cd30: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
cd40: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
cd50: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
cd60: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
cd70: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
cd80: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
cd90: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
cda0: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
cdb0: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
cdc0: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
cdd0: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
cde0: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
cdf0: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
ce00: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
ce10: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
ce20: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
ce30: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
ce40: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
ce50: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
ce60: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
ce70: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
ce80: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
ce90: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
cea0: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
ceb0: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
cec0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ced0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66  [hdr+1]);.    if
cee0: 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( iFree ){.     
cef0: 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67 65   int iFree2 = ge
cf00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
cf10: 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ee]);..      /* 
cf20: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 68  pageFindSlot() h
cf30: 61 73 20 61 6c 72 65 61 64 79 20 76 65 72 69 66  as already verif
cf40: 69 65 64 20 74 68 61 74 20 66 72 65 65 20 62 6c  ied that free bl
cf50: 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64 0a  ocks are sorted.
cf60: 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
cf70: 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74 68  r of offset with
cf80: 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e 64  in the page, and
cf90: 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65   that no block e
cfa0: 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20  xtends.      ** 
cfb0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
cfc0: 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69 64  the page. Provid
cfd0: 65 64 20 74 68 65 20 74 77 6f 20 66 72 65 65 20  ed the two free 
cfe0: 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20  slots do not .  
cff0: 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20      ** overlap, 
d000: 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  this guarantees 
d010: 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65  that the memmove
d020: 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77  () calls below w
d030: 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  ill not.      **
d040: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 75   overwrite the u
d050: 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20 62  sableSize byte b
d060: 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20 74  uffer, even if t
d070: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
d080: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 72  .      ** is cor
d090: 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rupt.  */.      
d0a0: 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d  assert( iFree2==
d0b0: 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72 65  0 || iFree2>iFre
d0c0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
d0d0: 74 28 20 69 46 72 65 65 2b 67 65 74 32 62 79 74  t( iFree+get2byt
d0e0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d  e(&data[iFree+2]
d0f0: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
d100: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d110: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
d120: 72 65 65 32 2b 67 65 74 32 62 79 74 65 28 26 64  ree2+get2byte(&d
d130: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c  ata[iFree2+2]) <
d140: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
d150: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
d160: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
d170: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
d180: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
d190: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
d1a0: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
d1b0: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
d1c0: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
d1d0: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
d1e0: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
d1f0: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
d200: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
d210: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
d220: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
d230: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
d240: 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e 3d         if( top>=
d250: 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  iFree ){.       
d260: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d270: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
d280: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
d290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
d2a0: 28 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20  ( iFree2 ){.    
d2b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
d2c0: 72 65 65 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29  ree+sz<=iFree2 )
d2d0: 3b 20 2f 2a 20 56 65 72 69 66 69 65 64 20 62 79  ; /* Verified by
d2e0: 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20   pageFindSlot() 
d2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32  */.          sz2
d300: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
d310: 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20  a[iFree2+2]);.  
d320: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d330: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72  iFree+sz+sz2+iFr
d340: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c  ee2-(iFree+sz) <
d350: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
d360: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
d370: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
d380: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
d390: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
d3a0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
d3b0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
d3c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d3d0: 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a     cbrk = top+sz
d3e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d3f0: 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f  ( cbrk+(iFree-to
d400: 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  p) <= usableSize
d410: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   );.        memm
d420: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
d430: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
d440: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
d450: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
d460: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
d470: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
d480: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
d490: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
d4a0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
d4b0: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
d4c0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
d4d0: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
d4e0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
d4f0: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
d500: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
d510: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
d520: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
d530: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
d540: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d550: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
d560: 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
d570: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
d580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
d590: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
d5a0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
d5b0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
d5c0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
d5d0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
d5e0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
d5f0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
d600: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
d610: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
d620: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
d630: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
d640: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
d650: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
d660: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d670: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
d680: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
d690: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
d6a0: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
d6b0: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
d6c0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
d6d0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
d6e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d6f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
d700: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
d710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d720: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
d730: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
d740: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
d750: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
d760: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
d770: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
d780: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
d790: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
d7a0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
d7b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
d7c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d7d0: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
d7e0: 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pgno);.    }.   
d7f0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
d800: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
d810: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
d820: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
d830: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
d840: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
d850: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
d860: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
d870: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
d880: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
d890: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
d8a0: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
d8b0: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
d8c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d8d0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
d8e0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
d8f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
d900: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
d910: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d920: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
d930: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
d940: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
d950: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
d960: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
d970: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
d980: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
d990: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
d9a0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
d9b0: 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75  .. defragment_ou
d9c0: 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  t:.  if( data[hd
d9d0: 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46  r+7]+cbrk-iCellF
d9e0: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
d9f0: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
da00: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
da10: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
da20: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
da30: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
da40: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
da50: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
da60: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
da70: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
da80: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+2] = 0;.  mem
da90: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
daa0: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
dab0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
dac0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
dad0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
dae0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
daf0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
db00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
db10: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
db20: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
db30: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
db40: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
db50: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
db60: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
db70: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
db80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
db90: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
dba0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
dbb0: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
dbc0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
dbd0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
dbe0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
dbf0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
dc00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
dc10: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
dc20: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
dc30: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
dc40: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
dc50: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
dc60: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
dc70: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
dc80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
dc90: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
dca0: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
dcb0: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
dcc0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
dcd0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
dce0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
dcf0: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
dd00: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
dd10: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
dd20: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
dd30: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
dd40: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
dd50: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
dd60: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
dd70: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
dd80: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
dd90: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
dda0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
ddb0: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
ddc0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
ddd0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
dde0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
ddf0: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
de00: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
de10: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
de20: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
de30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
de40: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  ;.  int size;   
de50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
de60: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
de70: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
de80: 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  pc>0 );.  while(
de90: 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d   pc<=usableSize-
dea0: 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  4 ){.    /* EVID
deb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
dec0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
ded0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
dee0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
def0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
df00: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
df10: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
df20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
df30: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
df40: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
df50: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
df60: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
df70: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
df80: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
df90: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
dfa0: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
dfb0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
dfc0: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
dfd0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
dfe0: 20 20 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e     if( size+pc >
dff0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
e000: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
e010: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e020: 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  O(pPg->pgno);.  
e030: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
e040: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e050: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  x<4 ){.        /
e060: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e070: 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20  -11498-58022 In 
e080: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
e090: 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74  tree page, the t
e0a0: 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  otal.        ** 
e0b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
e0c0: 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79  in fragments may
e0d0: 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20   not exceed 60. 
e0e0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  */.        if( a
e0f0: 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29  Data[hdr+7]>57 )
e100: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
e110: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
e120: 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20  e slot from the 
e130: 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74  free-list. Updat
e140: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  e the number of.
e150: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
e160: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
e170: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
e180: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
e190: 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61  aData[iAddr], &a
e1a0: 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  Data[pc], 2);.  
e1b0: 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b        aData[hdr+
e1c0: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
e1d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e1e0: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
e1f0: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
e200: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
e210: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
e220: 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66  nt.         ** f
e230: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
e240: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
e250: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
e260: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
e270: 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  aData[pc+2], x);
e280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e290: 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20  eturn &aData[pc 
e2a0: 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + x];.    }.    
e2b0: 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20  iAddr = pc;.    
e2c0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  pc = get2byte(&a
e2d0: 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69  Data[pc]);.    i
e2e0: 66 28 20 70 63 3c 69 41 64 64 72 2b 73 69 7a 65  f( pc<iAddr+size
e2f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
e300: 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20 2a 70  if( pc ){.    *p
e310: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
e320: 55 50 54 5f 50 47 4e 4f 28 70 50 67 2d 3e 70 67  UPT_PGNO(pPg->pg
e330: 6e 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  no);.  }..  retu
e340: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
e350: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
e360: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
e370: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
e380: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
e390: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
e3a0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
e3b0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
e3c0: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
e3d0: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
e3e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
e3f0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
e400: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
e410: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
e420: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
e430: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
e440: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
e450: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
e460: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
e470: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
e480: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
e490: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
e4a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
e4b0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
e4c0: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
e4d0: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
e4e0: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
e4f0: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
e500: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
e510: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
e520: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
e530: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
e540: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
e550: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
e560: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
e570: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
e580: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
e590: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
e5a0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
e5b0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
e5c0: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
e5d0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
e5e0: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
e5f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
e600: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
e610: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
e620: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
e630: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
e640: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
e650: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
e660: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
e670: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
e680: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
e690: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
e6a0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
e6b0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
e6e0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
e6f0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
e700: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
e730: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
e740: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
e750: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
e760: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
e770: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
e780: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
e790: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
e7a0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
e7b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
e7c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e7d0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
e7e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e7f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e800: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e810: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
e820: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
e830: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
e840: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
e850: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
e860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e870: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
e880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
e890: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
e8a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e8b0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
e8c0: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
e8d0: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
e8e0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
e8f0: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
e900: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
e910: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
e920: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
e930: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
e940: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
e950: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
e960: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
e970: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
e980: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
e990: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
e9a0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
e9b0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
e9c0: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
e9d0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
e9e0: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
e9f0: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
ea00: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
ea10: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
ea20: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
ea30: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
ea40: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
ea50: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
ea60: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
ea70: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
ea80: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
ea90: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
eaa0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
eab0: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
eac0: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
ead0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
eae0: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
eaf0: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
eb00: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
eb10: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
eb20: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
eb30: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
eb40: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
eb50: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
eb60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
eb70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
eb80: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
eb90: 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gno);.    }.  }.
eba0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
ebb0: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
ebc0: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
ebd0: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
ebe0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
ebf0: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
ec00: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
ec10: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
ec20: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
ec30: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
ec40: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
ec50: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
ec60: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
ec70: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
ec80: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
ec90: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
eca0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
ecb0: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
ecc0: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
ecd0: 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64  ;.  if( (data[hd
ece0: 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72  r+2] || data[hdr
ecf0: 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74  +1]) && gap+2<=t
ed00: 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53  op ){.    u8 *pS
ed10: 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53  pace = pageFindS
ed20: 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65  lot(pPage, nByte
ed30: 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
ed40: 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
ed50: 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d  assert( pSpace>=
ed60: 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20  data && (pSpace 
ed70: 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b  - data)<65536 );
ed80: 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28  .      *pIdx = (
ed90: 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61  int)(pSpace - da
eda0: 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
edb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
edc0: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b   }else if( rc ){
edd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
ede0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
edf0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f  * The request co
ee00: 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69  uld not be fulfi
ee10: 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65  lled using a fre
ee20: 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65  elist slot.  Che
ee30: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
ee40: 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f  f defragmentatio
ee50: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
ee60: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
ee70: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
ee80: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
ee90: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
eea0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
eeb0: 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52  >nCell>0 || CORR
eec0: 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63  UPT_DB );.    rc
eed0: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
eee0: 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20  e(pPage, MIN(4, 
eef0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28  pPage->nFree - (
ef00: 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20  2+nByte)));.    
ef10: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ef20: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
ef30: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
ef40: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
ef50: 20 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e   assert( gap+2+n
ef60: 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d  Byte<=top );.  }
ef70: 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ...  /* Allocate
ef80: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
ef90: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
efa0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
efb0: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
efc0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
efd0: 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65   area.  The btre
efe0: 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c  eInitPage() call
eff0: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
f000: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
f010: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
f020: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
f030: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
f040: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
f050: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
f060: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
f070: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
f080: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
f090: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
f0a0: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
f0b0: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
f0c0: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
f0d0: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
f0e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
f0f0: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
f100: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
f110: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
f120: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
f130: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
f140: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
f160: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
f170: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
f180: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
f190: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
f1a0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
f1b0: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
f1c0: 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a  aData[iStart].**
f1d0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
f1e0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53   the block is iS
f1f0: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
f200: 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c   Adjacent freebl
f210: 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63  ocks are coalesc
f220: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ed..**.** Note t
f230: 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20  hat even though 
f240: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
f250: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
f260: 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  y btreeInitPage(
f270: 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69  ),.** that routi
f280: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65  ne will not dete
f290: 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  ct overlap betwe
f2a0: 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  en cells or free
f2b0: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20  blocks.  Nor.** 
f2c0: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63  does it detect c
f2d0: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
f2e0: 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68  ks that encrouch
f2f0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76   into the reserv
f300: 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74  ed bytes.** at t
f310: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
f320: 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74  ge.  So do addit
f330: 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  ional corruption
f340: 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74   checks inside t
f350: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61  his.** routine a
f360: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
f370: 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
f380: 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
f390: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
f3a0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
f3b0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20  age *pPage, u16 
f3c0: 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a  iStart, u16 iSiz
f3d0: 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20  e){.  u16 iPtr; 
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f400: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
f410: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
f420: 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c  */.  u16 iFreeBl
f430: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
f440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f450: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
f460: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
f470: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68         /* Page h
f4a0: 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f  eader size.  0 o
f4b0: 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46  r 100 */.  u8 nF
f4c0: 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rag = 0;        
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e   /* Reduction in
f4f0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a   fragmentation *
f500: 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a  /.  u16 iOrigSiz
f510: 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20  e = iSize;      
f520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
f530: 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69  ginal value of i
f540: 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b  Size */.  u16 x;
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
f580: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
f590: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
f5a0: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
f5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
f5c0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
f5d0: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
f5e0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f5f0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
f600: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
f610: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
f620: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
f630: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
f640: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
f650: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
f660: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
f670: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
f680: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
f690: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
f6a0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
f6b0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
f6c0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
f6d0: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
f6e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
f6f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
f700: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f710: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f720: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
f730: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
f740: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
f750: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
f760: 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67  rt( iStart<=pPag
f770: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
f780: 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ze-4 );..  /* Th
f790: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
f7a0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
f7b0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
f7c0: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
f7d0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
f7e0: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
f7f0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
f800: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
f810: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f820: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
f830: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
f840: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
f850: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
f860: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
f870: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
f880: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
f890: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
f8a0: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
f8b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
f8c0: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
f8d0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
f8e0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
f8f0: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
f900: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
f910: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
f920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
f930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f940: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
f950: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
f960: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
f970: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
f980: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 70 50   if( iFreeBlk>pP
f990: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
f9a0: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
f9b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f9c0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
f9d0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
f9e0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
f9f0: 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65  Blk>iPtr || iFre
fa00: 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  eBlk==0 );.  .  
fa10: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
fa20: 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46  nt:.    **    iF
fa30: 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20  reeBlk:   First 
fa40: 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20  freeblock after 
fa50: 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20  iStart, or zero 
fa60: 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20  if none.    **  
fa70: 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68    iPtr:       Th
fa80: 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70  e address of a p
fa90: 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42  ointer to iFreeB
faa0: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
fab0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
fac0: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
fad0: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
fae0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
faf0: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
fb00: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
fb10: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
fb20: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
fb30: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
fb40: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
fb50: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
fb60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fb70: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
fb80: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45 6e  pgno);.      iEn
fb90: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
fba0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
fbb0: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
fbc0: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
fbd0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
fbe0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
fbf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fc00: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
fc10: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
fc20: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
fc30: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
fc40: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
fc50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
fc60: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
fc70: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
fc80: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
fc90: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
fca0: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
fcb0: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
fcc0: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
fcd0: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
fce0: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
fcf0: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
fd00: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
fd10: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
fd20: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
fd30: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
fd40: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
fd50: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
fd60: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
fd70: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
fd80: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
fd90: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
fda0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
fdb0: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
fdc0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
fdd0: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
fde0: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
fdf0: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
fe00: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
fe10: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
fe20: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
fe30: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
fe40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
fe50: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
fe60: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
fe70: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
fe80: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
fe90: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
fea0: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20  Frag;.  }.  x = 
feb0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
fec0: 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53  dr+5]);.  if( iS
fed0: 74 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f  tart<=x ){.    /
fee0: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
fef0: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
ff00: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
ff10: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ff20: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
ff30: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
ff40: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
ff50: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
ff60: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
ff70: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
ff80: 2f 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74  /.    if( iStart
ff90: 3c 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b  <x || iPtr!=hdr+
ffa0: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
ffb0: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
ffc0: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
ffd0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ffe0: 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
fff0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
10000 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
10010 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
10020 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
10030 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
10040 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
10050 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
10060 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
10070 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  art);.  }.  if( 
10080 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
10090 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
100a0 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a  SECURE ){.    /*
100b0 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
100c0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
100d0 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
100e0 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
100f0 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  .    ** option i
10100 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20  s enabled */.   
10110 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53   memset(&data[iS
10120 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29  tart], 0, iSize)
10130 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
10140 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
10150 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74  iFreeBlk);.  put
10160 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
10170 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
10180 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
10190 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
101a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
101b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
101c0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
101d0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
101e0 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
101f0 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
10200 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
10210 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
10220 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
10230 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
10240 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
10250 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
10260 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
10270 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
10280 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
10290 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
102a0 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
102b0 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
102c0 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
102d0 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
102e0 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
102f0 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
10300 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
10310 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
10320 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
10330 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
10340 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
10350 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
10360 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
10370 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10380 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
10390 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
103a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
103b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
103c0 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
103d0 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
103e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
103f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
10400 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
10410 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
10420 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
10430 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
10440 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
10450 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
10460 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
10470 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10480 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
10490 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
104a0 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
104b0 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
104c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
104d0 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
104e0 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
104f0 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
10500 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
10510 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c  7291-35328 A val
10520 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d  ue of 5 (0x05) m
10530 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
10540 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
10550 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ior table b-tree
10560 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
10570 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
10580 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d  ATA|PTF_INTKEY)=
10590 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =5 );.    /* EVI
105a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30  DENCE-OF: R-2690
105b0 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20  0-09176 A value 
105c0 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61  of 13 (0x0d) mea
105d0 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
105e0 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62  .    ** leaf tab
105f0 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
10600 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
10610 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
10620 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
10630 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61  )==13 );.    pPa
10640 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
10650 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
10660 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eaf ){.      pPa
10670 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
10680 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   1;.      pPage-
10690 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
106a0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b  reeParseCellPtr;
106b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
106c0 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
106d0 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
106e0 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
106f0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
10700 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
10710 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
10720 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
10730 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
10740 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
10750 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
10760 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
10770 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
10780 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
10790 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
107a0 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
107b0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
107c0 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37  E-OF: R-43316-37
107d0 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32  308 A value of 2
107e0 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68   (0x02) means th
107f0 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
10800 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64   ** interior ind
10810 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
10820 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
10830 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32  PTF_ZERODATA)==2
10840 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
10850 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d  NCE-OF: R-59615-
10860 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66  42828 A value of
10870 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73   10 (0x0a) means
10880 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
10890 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78     ** leaf index
108a0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
108b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
108c0 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c  F_ZERODATA|PTF_L
108d0 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20  EAF)==10 );.    
108e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
108f0 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  0;.    pPage->in
10900 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
10910 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
10920 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
10930 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20  CellPtrIndex;.  
10940 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
10950 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
10960 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
10970 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
10980 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
10990 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
109a0 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34  -OF: R-47608-564
109b0 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c  69 Any other val
109c0 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65  ue for the b-tre
109d0 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20  e page type is. 
109e0 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20     ** an error. 
109f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10a00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
10a10 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
10a20 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
10a30 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
10a40 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
10a50 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
10a60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10a70 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10a80 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
10a90 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
10aa0 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
10ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10ac0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
10ad0 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
10ae0 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
10af0 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
10b00 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
10b10 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
10b20 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
10b30 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
10b40 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
10b50 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
10b60 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
10b70 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
10b80 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
10b90 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
10ba0 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
10bb0 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
10bc0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10bd0 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
10be0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
10bf0 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  ){.  int pc;    
10c00 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10c10 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
10c20 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
10c30 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20  aData[] */.  u8 
10c40 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
10c50 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
10c60 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
10c70 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  eader */.  u8 *d
10c80 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
10c90 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
10ca0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68  >aData */.  BtSh
10cb0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
10cc0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
10cd0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
10ce0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
10cf0 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
10d00 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
10d10 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
10d20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
10d30 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
10d40 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
10d50 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
10d60 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
10d70 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
10d80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
10d90 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
10da0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74   page */.  int t
10db0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
10dc0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
10dd0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
10de0 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43  area */.  int iC
10df0 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
10e00 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
10e10 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
10e20 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  k offset */.  in
10e30 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
10e40 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
10e50 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
10e60 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
10e70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10e80 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
10e90 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
10ea0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
10eb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10ec0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
10ed0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
10ee0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
10ef0 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
10f00 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
10f10 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10f20 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
10f30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10f40 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10f50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
10f60 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
10f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10f80 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10f90 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10fa0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
10fb0 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20  ==0 );..  pBt = 
10fc0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64  pPage->pBt;.  hd
10fd0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
10fe0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
10ff0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f  Page->aData;.  /
11000 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11010 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
11020 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
11030 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
11040 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62  ating.  ** the b
11050 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e  -tree page type.
11060 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65   */.  if( decode
11070 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
11080 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20 72  a[hdr]) ){.    r
11090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
110a0 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
110b0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73  >pgno);.  }.  as
110c0 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
110d0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
110e0 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
110f0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
11100 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
11110 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
11120 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
11130 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73 61 62  flow = 0;.  usab
11140 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
11150 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  ableSize;.  pPag
11160 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
11170 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
11180 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
11190 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50  ildPtrSize;.  pP
111a0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
111b0 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
111c0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  ];.  pPage->aCel
111d0 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
111e0 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50 61 67  lOffset];.  pPag
111f0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
11200 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
11210 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20  dPtrSize];.  /* 
11220 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
11230 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
11240 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
11250 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
11260 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  gnates.  ** the 
11270 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
11280 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
11290 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72  A zero value for
112a0 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73   this integer is
112b0 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65  .  ** interprete
112c0 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
112d0 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
112e0 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
112f0 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  +5]);.  /* EVIDE
11300 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
11310 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
11320 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
11330 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
11340 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
11350 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
11360 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e  e. */.  pPage->n
11370 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
11380 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
11390 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
113a0 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
113b0 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
113c0 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
113d0 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
113e0 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
113f0 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
11400 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11410 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
11420 6f 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  o);.  }.  testca
11430 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
11440 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
11450 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
11460 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37  OF: R-24089-5797
11470 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74  9 If a page cont
11480 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77  ains no cells (w
11490 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a  hich is only.  *
114a0 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  * possible for a
114b0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
114c0 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
114d0 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65  ins no rows) the
114e0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65  n the.  ** offse
114f0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
11500 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20  ntent area will 
11510 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73  equal the page s
11520 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20  ize minus the.  
11530 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
11540 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
11550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11560 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
11570 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
11580 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f  RRUPT_DB );..  /
11590 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
115a0 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
115b0 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
115c0 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
115d0 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
115e0 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
115f0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
11600 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
11610 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
11620 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
11630 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
11640 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
11650 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
11660 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
11670 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
11680 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72  o be .  ** retur
11690 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
116a0 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73    */.  iCellFirs
116b0 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
116c0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
116d0 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
116e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
116f0 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c   if( pBt->db->fl
11700 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c  ags & SQLITE_Cel
11710 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69  lSizeCk ){.    i
11720 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11730 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
11740 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
11750 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
11760 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
11770 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
11780 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50   */..    if( !pP
11790 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
117a0 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72  lLast--;.    for
117b0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
117c0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
117d0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
117e0 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
117f0 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
11800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
11810 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
11820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11830 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
11840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
11850 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
11860 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
11870 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11880 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
11890 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
118a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d      }.      sz =
118b0 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
118c0 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  e(pPage, &data[p
118d0 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  c]);.      testc
118e0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62  ase( pc+sz==usab
118f0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
11900 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
11910 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
11920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11930 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
11940 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
11950 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
11960 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
11970 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20 20  ellLast++;.  }  
11980 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
11990 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
119a0 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
119b0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
119c0 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20  : R-23588-34450 
119d0 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
119e0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31  eger at offset 1
119f0 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20   gives the.  ** 
11a00 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
11a10 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
11a20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
11a30 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
11a40 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c  e no.  ** freebl
11a50 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20  ocks. */.  pc = 
11a60 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
11a70 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20  dr+1]);.  nFree 
11a80 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
11a90 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
11aa0 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
11ab0 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
11ac0 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b  */.  if( pc>0 ){
11ad0 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73  .    u32 next, s
11ae0 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  ize;.    if( pc<
11af0 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
11b00 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
11b10 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
11b20 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
11b30 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
11b40 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
11b50 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
11b60 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
11b70 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
11b80 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
11b90 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
11ba0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11bb0 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
11bc0 6f 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77  o); .    }.    w
11bd0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
11be0 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73   if( pc>iCellLas
11bf0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
11c00 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68  Freeblock off th
11c10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
11c20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
11c30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11c40 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
11c50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
11c60 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
11c70 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
11c80 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
11c90 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
11ca0 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20  ]);.      nFree 
11cb0 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
11cc0 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d        if( next<=
11cd0 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61  pc+size+3 ) brea
11ce0 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  k;.      pc = ne
11cf0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
11d00 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ( next>0 ){.    
11d10 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e    /* Freeblock n
11d20 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ot in ascending 
11d30 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72  order */.      r
11d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11d50 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
11d60 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  >pgno);.    }.  
11d70 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75    if( pc+size>(u
11d80 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62  nsigned int)usab
11d90 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
11da0 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63  /* Last freebloc
11db0 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70  k extends past p
11dc0 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  age end */.     
11dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11de0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
11df0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
11e00 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
11e10 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
11e20 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
11e30 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
11e40 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
11e50 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
11e60 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
11e70 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
11e80 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
11e90 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
11ea0 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
11eb0 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
11ec0 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
11ed0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61  e.  ** of the pa
11ee0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
11ef0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
11f00 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
11f10 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73  also.  ** serves
11f20 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
11f30 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
11f40 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
11f50 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  ell-content.  **
11f60 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
11f70 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
11f80 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
11f90 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a   the page..  */.
11fa0 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
11fb0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  leSize ){.    re
11fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11fd0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
11fe0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 70 50 61  pgno);.  }.  pPa
11ff0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
12000 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
12010 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  irst);.  pPage->
12020 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65  isInit = 1;.  re
12030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12040 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
12050 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
12060 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
12070 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
12080 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
12090 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
120a0 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
120b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
120c0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
120d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
120e0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
120f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12100 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
12110 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
12120 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
12130 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
12140 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12150 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
12160 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
12170 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
12180 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12190 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
121a0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
121b0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
121c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
121d0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
121e0 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
121f0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12200 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
12210 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
12220 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
12230 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12240 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12250 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
12260 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12270 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
12280 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
12290 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
122a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
122b0 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
122c0 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
122d0 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
122e0 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
122f0 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
12300 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
12310 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
12320 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
12330 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
12340 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
12350 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
12360 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
12370 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
12380 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
12390 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
123a0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
123b0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
123c0 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
123d0 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
123e0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
123f0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
12400 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
12410 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
12420 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
12430 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
12440 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
12450 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
12460 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12470 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
12480 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
12490 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
124a0 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
124b0 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
124c0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
124d0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
124e0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
124f0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
12500 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
12510 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
12520 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
12530 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
12540 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
12550 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
12560 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
12570 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
12580 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
12590 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
125a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
125b0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
125c0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
125d0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
125e0 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
125f0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
12600 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
12610 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
12620 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
12630 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
12640 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
12650 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
12660 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
12670 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
12680 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
12690 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
126a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
126b0 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
126c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
126d0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
126e0 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
126f0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
12700 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
12710 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
12720 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
12730 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
12740 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
12750 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
12760 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
12770 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
12780 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
12790 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
127a0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
127b0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
127c0 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
127d0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
127e0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
127f0 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
12800 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
12810 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
12820 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
12830 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
12840 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
12850 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
12860 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
12870 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
12880 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
12890 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
128a0 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
128b0 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
128c0 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
128d0 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
128e0 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
128f0 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
12900 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
12910 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
12920 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
12930 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
12940 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
12950 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12960 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
12970 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
12980 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
12990 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
129a0 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
129b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
129c0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
129d0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
129e0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
129f0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
12a00 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
12a10 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
12a20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
12a30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
12a40 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
12a50 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
12a60 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
12a70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12a80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12a90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
12aa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
12ab0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
12ac0 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
12ad0 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
12ae0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
12af0 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
12b00 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
12b10 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
12b20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
12b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12b40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
12b50 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
12b60 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
12b70 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
12b80 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
12b90 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
12ba0 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
12bb0 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
12bc0 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
12bd0 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
12be0 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
12bf0 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
12c00 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
12c10 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
12c20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
12c30 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
12c40 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
12c50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12c60 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12c70 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
12c80 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
12c90 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
12ca0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
12cb0 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
12cc0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
12cd0 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
12ce0 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
12cf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
12d00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
12d10 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
12d30 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
12d40 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
12d50 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
12d60 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
12d70 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
12d80 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
12d90 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
12da0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
12db0 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
12dc0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
12dd0 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
12de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
12df0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
12e00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
12e10 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
12e20 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20 29  0x80000000)==0 )
12e30 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
12e40 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
12e50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
12e60 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
12e70 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
12e80 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
12e90 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
12ea0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
12eb0 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
12ec0 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
12ed0 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
12ee0 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
12ef0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
12f00 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
12f10 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
12f20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
12f30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
12f40 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
12f50 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
12f60 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
12f70 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
12f80 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
12f90 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
12fa0 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
12fb0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
12fc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12fd0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
12fe0 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
12ff0 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
13000 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
13010 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
13020 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
13030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
13040 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
13050 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13070 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
13080 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
13090 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
130a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
130b0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
130c0 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
130d0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
130e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
130f0 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
13100 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
13110 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13130 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
13140 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
13150 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
13160 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
13170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13180 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
13190 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
131a0 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
131b0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
131c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
131d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
131e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
131f0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
13200 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67 65  ge==&pCur->pPage
13210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13220 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
13230 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
13240 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
13250 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
13260 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
13270 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
13280 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
13290 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
132a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
132b0 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
132c0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
132d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
132e0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
132f0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
13300 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
13310 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
13320 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
13330 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
13340 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
13350 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
13360 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
13370 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
13380 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
13390 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
133a0 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
133b0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
133c0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
133d0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
133e0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
133f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13410 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
13420 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
13430 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13440 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
13450 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
13460 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
13470 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
13480 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
13490 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
134a0 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
134b0 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
134c0 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
134d0 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
134e0 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
134f0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
13500 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
13510 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
13520 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
13530 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
13540 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
13550 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
13560 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
13570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13580 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
13590 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
135a0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
135b0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
135c0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
135d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
135e0 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50  OK;..getAndInitP
135f0 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  age_error:.  if(
13600 20 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75   pCur ){.    pCu
13610 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
13620 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
13630 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
13640 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74  >iPage];.  }.  t
13650 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
13660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
13670 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
13680 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
13690 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
136a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
136b0 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a  IT_CONCURRENT./*
136c0 20 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c   .** Set the val
136d0 75 65 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ue of the MemPag
136e0 65 2e 70 67 6e 6f 52 6f 6f 74 20 76 61 72 69 61  e.pgnoRoot varia
136f0 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73 74  ble, if it exist
13700 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13710 64 20 73 65 74 4d 65 6d 70 61 67 65 52 6f 6f 74  d setMempageRoot
13720 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 75  (MemPage *pPg, u
13730 33 32 20 70 67 6e 6f 52 6f 6f 74 29 7b 0a 20 20  32 pgnoRoot){.  
13740 70 50 67 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  pPg->pgnoRoot = 
13750 70 67 6e 6f 52 6f 6f 74 3b 0a 7d 0a 23 65 6c 73  pgnoRoot;.}.#els
13760 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 4d 65  e.# define setMe
13770 6d 70 61 67 65 52 6f 6f 74 28 78 2c 79 29 0a 23  mpageRoot(x,y).#
13780 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  endif../*.** Rel
13790 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
137a0 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
137b0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
137c0 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
137d0 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
137e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20  ge..**.** Page1 
137f0 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  is a special cas
13800 65 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  e and must be re
13810 6c 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c  leased using rel
13820 65 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a  easePageOne()..*
13830 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
13840 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
13850 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
13860 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
13870 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
13880 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
13890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
138a0 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
138b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
138c0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
138d0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
138e0 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
138f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
13900 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
13910 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
13920 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
13930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13940 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13950 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
13960 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
13970 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
13980 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
13990 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
139a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
139b0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
139c0 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
139d0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
139e0 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
139f0 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
13a00 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  One(MemPage *pPa
13a10 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
13a20 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
13a30 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
13a40 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
13a50 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
13a60 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
13a70 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
13a80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13a90 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
13aa0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
13ab0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
13ac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13ad0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
13ae0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
13af0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
13b00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13b10 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
13b20 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
13b30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
13b40 72 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65  refPageOne(pPage
13b50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ->pDbPage);.}../
13b60 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
13b70 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
13b80 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
13b90 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
13ba0 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
13bb0 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
13bc0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
13bd0 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
13be0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
13bf0 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
13c00 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
13c10 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
13c20 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
13c30 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
13c40 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
13c50 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
13c60 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
13c70 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
13c80 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
13c90 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
13ca0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
13cb0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
13cc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13cd0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
13ce0 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
13cf0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
13d00 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
13d10 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
13d20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
13d30 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
13d40 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
13d50 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
13d60 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
13d70 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
13d80 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
13d90 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
13da0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
13db0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
13dc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
13dd0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
13de0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
13df0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
13e00 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
13e10 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
13e20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
13e30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
13e40 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
13e50 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
13e60 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
13e70 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
13e80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13e90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
13ea0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
13eb0 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
13ec0 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
13ed0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
13ee0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
13ef0 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
13f00 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
13f10 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
13f20 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
13f30 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
13f40 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
13f50 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
13f60 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
13f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
13f80 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
13f90 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
13fa0 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
13fb0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
13fc0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
13fd0 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
13fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
13ff0 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
14000 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
14010 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
14020 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
14030 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
14040 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
14050 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
14060 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
14070 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
14080 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
14090 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
140a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
140b0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
140c0 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
140d0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
140e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
140f0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
14100 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
14110 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
14120 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
14130 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
14140 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
14150 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
14160 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
14170 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
14180 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
14190 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
141a0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
141b0 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
141c0 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
141d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
141e0 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
141f0 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
14200 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
14210 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
14220 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
14230 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
14240 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
14250 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
14260 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
14270 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
14280 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
14290 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
142a0 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
142b0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
142c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
142d0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
142e0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
142f0 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
14300 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
14310 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
14320 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
14330 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
14340 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
14350 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
14360 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
14370 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14380 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
14390 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
143a0 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
143b0 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
143c0 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
143d0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
143e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
143f0 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
14400 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
14410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14420 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
14430 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
14440 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
14450 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
14460 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
14470 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
14480 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
14490 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
144a0 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
144b0 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
144c0 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
144d0 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
144e0 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
144f0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
14500 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
14510 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
14520 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
14530 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
14540 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
14550 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
14560 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
14570 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
14580 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
14590 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
145a0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
145b0 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
145c0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
145d0 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
145e0 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
145f0 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
14600 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
14610 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
14620 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
14630 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
14640 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
14650 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
14660 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
14670 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
14680 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
14690 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
146a0 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
146b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
146c0 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
146d0 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
146e0 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
146f0 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
14700 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
14710 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
14720 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
14730 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
14740 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
14750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14760 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
14770 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
14780 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
14790 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
147a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
147b0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
147c0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
147d0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
147e0 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
147f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14800 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
14810 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
14820 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
14830 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
14840 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14850 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
14860 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
14870 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
14880 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
14890 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
148a0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
148b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
148c0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
148d0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
148e0 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
148f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
14900 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
14910 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
14920 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
14930 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
14960 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
14970 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
14980 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
14990 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
149a0 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
149b0 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
149c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
149d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
149e0 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
149f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
14a00 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
14a30 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
14a40 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
14a50 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
14a60 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
14a70 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
14a80 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
14a90 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
14aa0 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
14ab0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
14ac0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
14ad0 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
14ae0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
14af0 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
14b00 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
14b10 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
14b20 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
14b30 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
14b40 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
14b50 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
14b60 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
14b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
14b80 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
14b90 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
14ba0 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
14bb0 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
14bc0 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
14bd0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
14be0 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
14c10 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
14c20 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
14c50 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
14c60 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
14c70 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
14c80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14c90 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
14ca0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14cb0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
14cc0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
14cd0 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
14ce0 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
14cf0 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
14d00 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
14d10 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
14d20 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
14d30 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
14d40 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
14d50 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
14d60 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
14d70 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
14d80 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
14d90 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
14da0 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
14db0 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
14dc0 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
14dd0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
14de0 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
14df0 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
14e00 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
14e10 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
14e20 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
14e30 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
14e40 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
14e50 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
14e60 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
14e70 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
14e80 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
14e90 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
14ea0 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
14eb0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
14ec0 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
14ed0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
14ee0 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
14ef0 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
14f00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14f10 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e  _BKPT;.  }.  p->
14f20 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
14f30 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
14f40 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
14f50 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14f60 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
14f70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
14f80 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
14f90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
14fa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fb0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
14fc0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14fd0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
14fe0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
14ff0 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
15000 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
15010 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
15020 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
15030 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
15040 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
15050 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
15060 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
15070 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
15080 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
15090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
150a0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
150b0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
150c0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
150d0 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
150e0 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
150f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
15100 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
15110 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
15120 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
15130 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
15140 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
15150 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
15160 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
15170 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
15180 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
15190 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
151a0 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
151b0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
151c0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
151d0 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
151e0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
151f0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
15200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15210 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15230 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
15240 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
15250 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
15260 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65  ename, nFilename
15270 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15280 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15290 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
152a0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
152b0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
152e0 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
152f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
15300 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
15310 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
15320 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
15330 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15340 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
15350 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15370 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
15380 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
15390 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
153a0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
153b0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
153c0 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
153d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
153e0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
153f0 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
15400 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
15410 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
15420 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
15430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15440 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
15450 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
15460 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
15470 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15480 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15490 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
154a0 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
154b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
154c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
154d0 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
154e0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
154f0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
15500 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
15510 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
15520 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
15530 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
15540 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
15550 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
15560 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
15570 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
15580 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
15590 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
155a0 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
155b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
155c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
155d0 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
155e0 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
155f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
15600 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15610 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
15620 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
15630 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15640 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
15650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
15660 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
15670 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
15680 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15690 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
156a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
156b0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
156c0 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
156d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
156e0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
156f0 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
15700 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
15710 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15740 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
15750 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
15760 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
15770 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
15780 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
15790 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
157a0 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
157b0 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
157c0 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
157d0 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
157e0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
157f0 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
15800 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
15810 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
15820 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
15830 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
15840 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
15850 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
15860 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
15870 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
15880 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
15890 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
158a0 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
158b0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
158c0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
158d0 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
158e0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
158f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
15900 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
15910 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
15920 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
15930 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
15940 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
15950 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
15960 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
15970 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
15980 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
15990 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
159a0 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
159b0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
159c0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
159d0 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73  4)==8 );.    ass
159e0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
159f0 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
15a00 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
15a10 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
15a20 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
15a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
15a40 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
15a50 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
15a60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
15a70 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
15a80 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
15a90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
15aa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
15ab0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
15ac0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15ad0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
15ae0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
15af0 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
15b00 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d        sizeof(Mem
15b30 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66  Page), flags, vf
15b40 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
15b50 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
15b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15b80 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15b90 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
15ba0 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
15bb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
15bc0 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
15bd0 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
15be0 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
15bf0 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
15c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15c10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
15c20 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
15c30 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
15c40 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
15c50 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
15c60 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
15c70 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
15c80 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
15c90 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
15ca0 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
15cb0 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
15cc0 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
15cd0 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
15ce0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
15cf0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
15d00 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
15d10 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
15d20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15d30 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
15d40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
15d50 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
15d60 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  E).    pBt->btsF
15d70 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
15d80 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66  RE_DELETE;.#elif
15d90 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15da0 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c 45  FAST_SECURE_DELE
15db0 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
15dc0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45  Flags |= BTS_OVE
15dd0 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20  RWRITE;.#endif. 
15de0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
15df0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
15e00 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
15e10 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
15e20 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
15e30 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
15e40 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
15e50 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
15e60 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
15e70 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
15e80 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
15e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
15ea0 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
15eb0 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
15ec0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
15ed0 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
15ee0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
15ef0 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
15f00 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
15f10 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
15f20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
15f30 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
15f40 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
15f50 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
15f60 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
15f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15f80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
15f90 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
15fa0 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
15fb0 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
15fc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15fd0 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
15fe0 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
15ff0 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
16000 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
16010 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
16020 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
16030 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
16040 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
16050 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
16060 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
16070 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
16080 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
16090 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
160a0 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
160b0 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
160c0 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
160d0 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
160e0 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
160f0 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
16100 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
16110 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
16120 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
16130 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
16140 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
16150 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
16160 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
16170 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
16180 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
16190 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
161a0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
161b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
161c0 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
161d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
161e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
161f0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
16200 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
16210 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
16220 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
16230 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
16240 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
16250 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
16260 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
16270 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
16280 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
16290 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
162a0 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
162b0 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
162c0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
162d0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
162e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
162f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
16300 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
16310 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
16320 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
16330 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
16340 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
16350 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
16360 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
16370 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
16380 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
16390 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
163a0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
163b0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
163c0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
163d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
163e0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
163f0 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
16400 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
16410 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
16420 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
16430 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
16440 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
16450 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
16460 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
16470 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
16480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16490 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
164a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
164b0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
164c0 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
164d0 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
164e0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
164f0 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
16500 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
16510 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
16520 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
16530 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
16540 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
16550 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
16560 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
16570 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
16580 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
16590 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
165a0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
165b0 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
165c0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
165d0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
165e0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
165f0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
16600 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
16610 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16620 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
16630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16640 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
16650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
16660 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
16670 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
16680 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
16690 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
166a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
166b0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
166c0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
166d0 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
166e0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
166f0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16700 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
16710 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16720 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16730 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
16740 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
16750 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
16760 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
16770 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
16780 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16790 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
167a0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
167b0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
167c0 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
167d0 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
167e0 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
167f0 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
16800 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
16810 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
16820 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
16830 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
16840 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
16850 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
16860 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
16870 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
16880 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
16890 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
168a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
168b0 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
168c0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
168d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
168e0 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
168f0 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
16900 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
16910 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
16920 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
16930 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
16940 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
16950 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
16960 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
16970 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
16980 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
16990 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
169a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
169b0 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
169c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
169d0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
169e0 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
169f0 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
16a00 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
16a10 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
16a20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
16a30 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
16a40 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
16a50 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
16a60 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
16a70 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
16a80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
16a90 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
16aa0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
16ab0 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
16ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16ad0 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
16ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16af0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16b00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
16b10 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
16b20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
16b30 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
16b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16b50 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
16b60 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
16b70 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16b80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
16b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16ba0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
16bb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16bc0 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
16bd0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
16be0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
16bf0 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  *pFile;..    /* 
16c00 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
16c10 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
16c20 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
16c30 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
16c40 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
16c50 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
16c60 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
16c70 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
16c80 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
16c90 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
16ca0 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
16cb0 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
16cc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
16cd0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
16ce0 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
16cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
16d00 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16d10 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
16d20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
16d30 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
16d40 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73  }..    pFile = s
16d50 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
16d60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
16d70 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
16d80 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73  thods ){.      s
16d90 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
16da0 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53  rolHint(pFile, S
16db0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c  QLITE_FCNTL_PDB,
16dc0 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62   (void*)&pBt->db
16dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
16de0 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
16df0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
16e00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
16e10 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
16e20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16e30 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
16e40 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
16e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
16e60 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e  sqlite3BtreeConn
16e70 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42  ectionCount(*ppB
16e80 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74  tree)>0 );.  ret
16e90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16ea0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
16eb0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
16ec0 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
16ed0 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
16ee0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
16ef0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
16f00 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
16f10 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
16f20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
16f30 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
16f40 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
16f50 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
16f60 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
16f70 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
16f80 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
16f90 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
16fa0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
16fb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16fc0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
16fd0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
16fe0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
16ff0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
17000 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
17010 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
17020 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17030 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
17040 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17050 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
17060 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
17070 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
17080 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
17090 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
170a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
170b0 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
170c0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
170d0 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
170e0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
170f0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
17100 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
17110 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
17120 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
17130 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
17140 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
17150 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
17160 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
17170 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
17180 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
17190 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
171a0 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
171b0 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
171c0 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
171d0 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
171e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
171f0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
17200 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
17210 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
17220 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
17230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17240 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
17250 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
17260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
17270 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
17280 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
17290 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
172a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
172b0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
172c0 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
172d0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
172e0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
172f0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
17300 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
17310 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
17320 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
17330 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
17340 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
17350 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
17360 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
17370 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
17380 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
17390 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
173a0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
173b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
173c0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
173d0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
173e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
173f0 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
17400 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
17410 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
17420 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
17430 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
17440 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
17450 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
17460 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
17470 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
17480 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
17490 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
174a0 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
174b0 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
174c0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
174d0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
174e0 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
174f0 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
17500 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
17510 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
17520 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
17530 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
17540 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
17550 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
17560 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
17570 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
17580 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
17590 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
175a0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
175b0 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
175c0 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
175d0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
175e0 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
175f0 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
17600 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
17610 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
17620 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
17630 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
17640 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
17650 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
17660 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
17670 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
17680 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
17690 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
176a0 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
176b0 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
176c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
176d0 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
176e0 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
176f0 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
17700 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
17710 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
17720 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
17730 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
17740 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
17750 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
17760 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
17770 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
17780 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
17790 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
177a0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
177b0 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
177c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
177d0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
177e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
177f0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
17800 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
17810 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
17820 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
17830 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
17840 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
17850 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
17860 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
17870 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
17880 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
17890 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
178a0 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
178b0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
178c0 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
178d0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
178e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
178f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17900 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
17910 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
17920 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
17930 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
17940 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
17950 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17960 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17970 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17980 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17990 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
179a0 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
179b0 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
179c0 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
179d0 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
179e0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
179f0 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
17a00 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
17a10 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
17a20 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
17a30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
17a40 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
17a50 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17a60 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
17a70 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
17a80 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
17a90 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
17aa0 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
17ab0 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
17ac0 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
17ad0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
17ae0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
17af0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
17b00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17b10 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
17b20 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
17b30 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
17b40 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
17b50 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
17b60 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
17b70 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
17b80 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
17b90 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
17ba0 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
17bb0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
17bc0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
17bd0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
17be0 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
17bf0 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
17c00 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
17c10 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
17c20 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
17c30 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
17c40 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
17c50 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
17c60 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
17c70 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
17c80 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
17c90 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
17ca0 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
17cb0 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
17cc0 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
17cd0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
17ce0 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
17cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
17d00 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
17d10 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20  ger, p->db);.   
17d20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
17d30 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
17d40 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
17d50 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
17d60 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
17d70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17d80 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
17d90 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
17da0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
17db0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17dc0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
17dd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17de0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
17df0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
17e00 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
17e10 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
17e20 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
17e30 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
17e40 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
17e50 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
17e60 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
17e70 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
17e80 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
17e90 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
17ea0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17eb0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17ec0 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20  he "soft" limit 
17ed0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
17ee0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
17ef0 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61  che..** Unused a
17f00 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61  nd unmodified pa
17f10 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79  ges will be recy
17f20 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  cled when the nu
17f30 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
17f40 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78   in the cache ex
17f50 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20  ceeds this soft 
17f60 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20  limit.  But the 
17f70 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
17f80 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ache is allowed 
17f90 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74  to grow larger t
17fa0 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69  han this limit i
17fb0 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  f it contains.**
17fc0 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20   dirty pages or 
17fd0 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61  pages still in a
17fe0 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ctive use..*/.in
17ff0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18000 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
18010 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
18020 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
18030 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
18040 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18050 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
18060 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
18070 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18080 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
18090 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
180a0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
180b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
180c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
180d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
180e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
180f0 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74  he "spill" limit
18100 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
18110 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
18120 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ache..** If the 
18130 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
18140 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d  exceeds this lim
18150 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74  it during a writ
18160 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  e transaction,.*
18170 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68  * the pager migh
18180 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70  t attempt to "sp
18190 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68  ill" pages to th
181a0 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20  e journal early 
181b0 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66  in.** order to f
181c0 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a  ree up memory..*
181d0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
181e0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63  eturned is the c
181f0 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
18200 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70  e.  If zero is p
18210 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61  assed.** as an a
18220 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e  rgument, no chan
18230 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
18240 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73  the spill size s
18250 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73  etting, so.** us
18260 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20  ing mxPage of 0 
18270 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72  is a way to quer
18280 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  y the current sp
18290 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74  ill size..*/.int
182a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
182b0 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20  SpillSize(Btree 
182c0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
182d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
182e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
182f0 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
18300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18310 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
18320 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
18330 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65  eeEnter(p);.  re
18340 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  s = sqlite3Pager
18350 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74  SetSpillsize(pBt
18360 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
18370 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18380 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18390 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20  urn res;.}..#if 
183a0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
183b0 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
183c0 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
183d0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
183e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
183f0 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
18400 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
18410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18420 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
18430 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
18440 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
18450 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18460 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
18470 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18480 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
18490 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
184a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
184b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
184c0 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
184d0 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
184e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
184f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
18510 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18520 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
18530 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
18540 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
18550 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
18560 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
18570 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
18580 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
18590 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
185a0 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
185b0 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
185c0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
185d0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
185e0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
185f0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
18600 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
18610 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
18620 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
18630 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
18640 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
18650 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
18660 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
18670 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
18680 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
18690 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
186a0 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
186b0 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
186c0 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
186d0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
186e0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
186f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18700 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
18710 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
18720 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
18730 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
18740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18750 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
18760 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
18770 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
18780 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
18790 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
187a0 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
187b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
187c0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
187d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
187e0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
187f0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
18800 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18810 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
18820 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
18830 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
18840 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18850 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
18860 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
18870 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
18880 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
18890 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
188a0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
188b0 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
188c0 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
188d0 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
188e0 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
188f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
18900 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
18910 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
18920 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
18930 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
18940 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
18950 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
18960 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
18970 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
18980 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
18990 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
189a0 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
189b0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
189c0 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
189d0 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
189e0 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
189f0 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
18a00 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
18a10 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
18a20 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
18a30 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
18a40 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
18a50 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
18a60 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
18a70 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
18a80 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
18a90 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
18aa0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
18ab0 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
18ac0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
18ad0 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
18ae0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
18af0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
18b00 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
18b10 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
18b20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
18b30 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
18b40 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
18b50 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
18b60 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
18b70 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
18b80 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
18b90 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
18ba0 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
18bb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18bc0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
18bd0 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
18be0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
18bf0 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
18c00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18c10 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
18c20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18c30 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
18c40 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
18c50 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
18c60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18c70 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
18c80 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
18c90 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
18ca0 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
18cb0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
18cc0 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
18cd0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
18ce0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18cf0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
18d00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
18d10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
18d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
18d30 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
18d40 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
18d50 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
18d60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
18d70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
18d80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
18d90 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
18da0 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
18db0 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
18dc0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
18dd0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
18de0 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
18df0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
18e00 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
18e10 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
18e20 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
18e30 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
18e40 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
18e50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
18e60 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
18e70 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
18e80 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
18e90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
18ea0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
18eb0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
18ec0 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
18ed0 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
18ee0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
18ef0 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
18f00 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
18f10 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
18f20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
18f30 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
18f40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18f60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18f70 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
18f80 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
18f90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18fa0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
18fb0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
18fc0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
18fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18fe0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
18ff0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
19000 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
19010 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
19020 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
19030 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
19040 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
19050 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
19060 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
19070 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
19080 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
19090 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
190a0 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
190b0 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
190c0 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
190d0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
190e0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
190f0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
19100 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
19110 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
19120 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
19130 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
19140 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
19150 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
19160 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
19170 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
19180 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
19190 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
191a0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
191b0 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
191c0 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
191d0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
191e0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
191f0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
19200 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
19210 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19220 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
19230 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
19240 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
19250 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
19260 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
19270 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
19280 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19290 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
192a0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
192b0 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
192c0 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
192d0 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
192e0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
192f0 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
19300 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
19310 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
19320 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
19330 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
19340 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
19350 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
19360 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
19370 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
19380 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
19390 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
193a0 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
193b0 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
193c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
193d0 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
193e0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
193f0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
19400 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19410 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
19420 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
19430 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
19440 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
19450 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
19460 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
19470 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
19480 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
19490 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
194a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
194b0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
194c0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
194d0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
194e0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
194f0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
19500 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
19510 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
19520 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
19530 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
19540 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
19550 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
19560 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
19570 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
19580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19590 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
195a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
195b0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
195c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
195d0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
195e0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
195f0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
19600 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
19610 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19620 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
19630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
19640 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72  e the values for
19650 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
19660 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f  DELETE and BTS_O
19670 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a 0a  VERWRITE flags:.
19680 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  **.**    newFlag
19690 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20 42  ==0       Both B
196a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
196b0 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
196c0 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  TE are cleared.*
196d0 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20  *    newFlag==1 
196e0 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45        BTS_SECURE
196f0 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64 20  _DELETE set and 
19700 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73  BTS_OVERWRITE is
19710 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e   cleared.**    n
19720 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20 20  ewFlag==2       
19730 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
19740 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42 54  E cleared and BT
19750 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 73  S_OVERWRITE is s
19760 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  et.**    newFlag
19770 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68 61  ==(-1)    No cha
19780 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nges.**.** This 
19790 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
197a0 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46 6c  a query if newFl
197b0 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ag is less than 
197c0 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  zero.**.** With 
197d0 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73 65  BTS_OVERWRITE se
197e0 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  t, deleted conte
197f0 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  nt is overwritte
19800 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a  n by zeros, but.
19810 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  ** freelist leaf
19820 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 77   pages are not w
19830 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74  ritten back to t
19840 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
19850 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65  us in-page.** de
19860 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73  leted content is
19870 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66 72   cleared, but fr
19880 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20 63  eelist deleted c
19890 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a  ontent is not..*
198a0 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53 45  *.** With BTS_SE
198b0 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65  CURE_DELETE, ope
198c0 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42  ration is like B
198d0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69 74  TS_OVERWRITE wit
198e0 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a  h the addition.*
198f0 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74 20  * that freelist 
19900 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20 77  leaf pages are w
19910 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
19920 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
19930 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65  ncreasing.** the
19940 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20   amount of disk 
19950 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  I/O..*/.int sqli
19960 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
19970 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
19980 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
19990 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
199a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
199b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
199c0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42  (p);.  assert( B
199d0 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42 54  TS_OVERWRITE==BT
199e0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a  S_SECURE_DELETE*
199f0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42  2 );.  assert( B
19a00 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d 3d  TS_FAST_SECURE==
19a10 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c 42  (BTS_OVERWRITE|B
19a20 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19a30 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  ) );.  if( newFl
19a40 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
19a50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
19a60 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52   ~BTS_FAST_SECUR
19a70 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  E;.    p->pBt->b
19a80 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
19a90 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77  ECURE_DELETE*new
19aa0 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20  Flag;.  }.  b = 
19ab0 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  (p->pBt->btsFlag
19ac0 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43  s & BTS_FAST_SEC
19ad0 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45 5f  URE)/BTS_SECURE_
19ae0 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74 65  DELETE;.  sqlite
19af0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19b00 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f    return b;.}../
19b10 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19b20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
19b30 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
19b40 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
19b50 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
19b60 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
19b70 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
19b80 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
19b90 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
19ba0 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
19bb0 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
19bc0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
19bd0 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
19be0 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
19bf0 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
19c00 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
19c10 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
19c20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19c30 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
19c40 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
19c50 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
19c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
19c70 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
19c80 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
19c90 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
19ca0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19cb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19cc0 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
19cd0 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
19ce0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
19cf0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
19d00 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
19d10 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
19d20 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
19d30 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
19d40 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
19d50 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
19d60 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
19d70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
19d80 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
19d90 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
19da0 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
19db0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19dc0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19dd0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
19de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19df0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
19e00 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
19e10 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
19e20 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
19e30 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
19e40 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
19e50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19e60 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
19e70 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
19e80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
19e90 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
19ea0 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
19eb0 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
19ec0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
19ed0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19ee0 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
19ef0 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
19f00 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
19f10 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
19f20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
19f30 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
19f40 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
19f50 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
19f60 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
19f70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
19f90 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
19fa0 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
19fb0 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61 66   not set the saf
19fc0 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety-level for th
19fd0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
19fe0 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20  ection.** using 
19ff0 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e  "PRAGMA synchron
1a000 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68 65  ous", and if the
1a010 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69 73   safety-level is
1a020 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
1a030 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
1a040 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1a050 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20  function as the 
1a060 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1a070 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a  ,.** set it so..
1a080 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
1a090 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55  FAULT_SYNCHRONOU
1a0a0 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  S!=SQLITE_DEFAUL
1a0b0 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
1a0c0 53 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66 69  S \.    && !defi
1a0d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1a0e0 57 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69 64  WAL).static void
1a0f0 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1a100 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42  lag(BtShared *pB
1a110 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76  t, u8 safety_lev
1a120 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  el){.  sqlite3 *
1a130 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  db;.  Db *pDb;. 
1a140 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62   if( (db=pBt->db
1a150 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d  )!=0 && (pDb=db-
1a160 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  >aDb)!=0 ){.    
1a170 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d  while( pDb->pBt=
1a180 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e  =0 || pDb->pBt->
1a190 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b  pBt!=pBt ){ pDb+
1a1a0 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62  +; }.    if( pDb
1a1b0 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20  ->bSyncSet==0 . 
1a1c0 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65      && pDb->safe
1a1d0 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79  ty_level!=safety
1a1e0 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20  _level .     && 
1a1f0 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d  pDb!=&db->aDb[1]
1a200 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70   .    ){.      p
1a210 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1a220 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b   = safety_level;
1a230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1a240 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
1a250 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  >pPager,.       
1a260 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
1a270 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67  evel | (db->flag
1a280 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
1a290 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20  MASK));.    }.  
1a2a0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
1a2b0 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e  ne setDefaultSyn
1a2c0 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79  cFlag(pBt,safety
1a2d0 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a  _level).#endif..
1a2e0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
1a2f0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
1a300 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a310 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
1a320 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
1a330 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
1a340 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
1a350 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a360 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1a370 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
1a380 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
1a390 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
1a3a0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
1a3b0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
1a3c0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
1a3d0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1a3e0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
1a3f0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
1a400 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
1a410 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
1a420 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
1a430 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
1a440 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
1a450 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1a460 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a470 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1a480 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
1a490 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
1a4a0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
1a4b0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
1a4c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1a4d0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1a4e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a4f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1a500 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a510 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
1a520 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
1a530 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1a540 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1a550 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
1a560 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1a570 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1a580 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
1a590 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
1a5a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a5b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a5c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a5d0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
1a5e0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
1a5f0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
1a600 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
1a610 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a620 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1a630 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
1a640 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1a650 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
1a660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a670 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1a680 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
1a690 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
1a6a0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
1a6b0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
1a6c0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
1a6d0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
1a6e0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
1a6f0 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
1a700 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
1a710 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
1a720 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1a730 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1a740 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
1a750 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
1a760 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
1a770 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
1a780 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1a790 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
1a7a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
1a7b0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
1a7c0 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
1a7d0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
1a7e0 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
1a7f0 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
1a800 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
1a810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1a820 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
1a830 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
1a840 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
1a850 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
1a860 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
1a870 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
1a880 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
1a890 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
1a8a0 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
1a8b0 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
1a8c0 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
1a8d0 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
1a8e0 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
1a8f0 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
1a900 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
1a910 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a920 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
1a930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1a940 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1a950 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
1a960 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1a970 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
1a980 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
1a990 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
1a9a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a9b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
1a9c0 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
1a9d0 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
1a9e0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a9f0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1aa00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1aa10 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
1aa20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1aa30 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1aa40 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1aa50 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
1aa60 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
1aa70 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
1aa80 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
1aa90 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
1aaa0 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
1aab0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1aac0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
1aad0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
1aae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
1aaf0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1ab00 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
1ab10 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
1ab20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
1ab30 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
1ab40 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
1ab50 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
1ab60 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
1ab70 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
1ab80 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
1ab90 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1aba0 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
1abb0 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
1abc0 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
1abd0 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
1abe0 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
1abf0 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
1ac00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ac10 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
1ac20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1ac30 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
1ac40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
1ac50 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
1ac60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ac70 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
1ac80 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
1ac90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1aca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1acb0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1acc0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
1acd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1ace0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
1acf0 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
1ad00 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
1ad10 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20  ONOUS+1);.      
1ad20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
1ad30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1ad40 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1ad50 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e1);.          r
1ad60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ad70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ad80 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
1ad90 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
1ada0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65   }else{.      se
1adb0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
1adc0 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
1add0 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
1ade0 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +1);.    }.#endi
1adf0 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
1ae00 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
1ae10 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
1ae20 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
1ae30 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
1ae40 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
1ae50 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
1ae60 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
1ae70 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
1ae80 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
1ae90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
1aea0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
1aeb0 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
1aec0 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
1aed0 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
1aee0 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
1aef0 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
1af00 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
1af10 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
1af20 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
1af30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
1af40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1af50 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1af60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
1af70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
1af80 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
1af90 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
1afa0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
1afb0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
1afc0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
1afd0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
1afe0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
1aff0 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
1b000 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
1b010 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
1b020 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
1b030 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
1b040 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
1b050 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
1b060 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1b070 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
1b080 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
1b090 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
1b0a0 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
1b0b0 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
1b0c0 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
1b0d0 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
1b0e0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
1b0f0 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
1b100 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
1b110 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
1b120 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
1b130 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
1b140 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1b150 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
1b160 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
1b170 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
1b180 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b190 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
1b1a0 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
1b1b0 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
1b1c0 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
1b1d0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
1b1e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1b1f0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1b200 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
1b210 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
1b220 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
1b230 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
1b240 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
1b250 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
1b260 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
1b270 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
1b280 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
1b290 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1b2a0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
1b2b0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
1b2c0 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1b2d0 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
1b2e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b2f0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
1b300 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
1b310 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
1b320 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
1b330 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
1b340 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1b350 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
1b360 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
1b370 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b380 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
1b390 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
1b3a0 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
1b3b0 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
1b3c0 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
1b3d0 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
1b3e0 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
1b3f0 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
1b400 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
1b410 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1b420 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
1b430 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
1b440 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
1b450 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
1b460 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
1b470 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
1b480 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
1b490 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
1b4a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b4b0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1b4c0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1b4d0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1b4e0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1b4f0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1b500 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1b510 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1b520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b530 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1b540 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1b550 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b580 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1b590 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1b5a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1b5b0 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
1b5c0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
1b5d0 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26 26 20  teSchema)==0 && 
1b5e0 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
1b5f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1b600 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b610 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
1b620 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1b630 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
1b640 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33  IDENCE-OF: R-283
1b650 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72  12-64704 However
1b660 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a  , the usable siz
1b670 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  e is not allowed
1b680 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65   to.    ** be le
1b690 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20  ss than 480. In 
1b6a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1b6b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
1b6c0 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20   512, then the. 
1b6d0 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73     ** reserved s
1b6e0 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74  pace size cannot
1b6f0 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20   exceed 32. */. 
1b700 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
1b710 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
1b720 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1b730 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1b740 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
1b750 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
1b760 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
1b770 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
1b780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b790 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1b7a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1b7b0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
1b7c0 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
1b7d0 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
1b7e0 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
1b7f0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
1b800 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
1b810 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
1b820 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
1b830 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
1b840 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
1b850 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
1b860 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
1b870 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
1b880 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
1b890 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
1b8a0 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
1b8b0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
1b8c0 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
1b8d0 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
1b8e0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
1b8f0 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
1b900 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
1b910 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
1b920 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
1b930 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
1b940 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
1b950 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
1b960 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
1b970 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
1b980 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
1b990 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
1b9a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
1b9b0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
1b9c0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
1b9d0 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
1b9e0 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
1b9f0 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
1ba00 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
1ba10 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
1ba20 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
1ba30 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
1ba40 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
1ba50 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
1ba60 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
1ba70 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
1ba80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1ba90 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
1baa0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
1bab0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1bac0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
1bad0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
1bae0 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
1baf0 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
1bb00 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
1bb10 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
1bb20 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
1bb30 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
1bb40 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
1bb50 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
1bb60 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
1bb70 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
1bb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
1bb90 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1bba0 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
1bbb0 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
1bbc0 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
1bbd0 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
1bbe0 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
1bbf0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
1bc00 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
1bc10 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1bc20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bc30 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
1bc40 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
1bc50 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1bc60 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
1bc70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bc80 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bc90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1bca0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
1bcb0 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
1bcc0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
1bcd0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
1bce0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
1bcf0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
1bd00 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
1bd10 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
1bd20 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
1bd30 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1bd40 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
1bd50 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
1bd60 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
1bd70 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
1bd80 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
1bd90 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
1bda0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
1bdb0 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
1bdc0 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
1bdd0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
1bde0 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
1bdf0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
1be00 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
1be10 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
1be20 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
1be30 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
1be40 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
1be50 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
1be60 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
1be70 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
1be80 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
1be90 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
1bea0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
1beb0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
1bec0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
1bed0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
1bee0 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
1bef0 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
1bf00 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
1bf10 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
1bf20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
1bf30 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
1bf40 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
1bf50 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
1bf60 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
1bf70 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
1bf80 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
1bf90 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
1bfa0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
1bfb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
1bfc0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
1bfd0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1bfe0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
1bff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
1c000 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
1c010 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1c020 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
1c030 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
1c040 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
1c050 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
1c060 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1c070 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
1c080 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
1c090 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1c0a0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1c0b0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
1c0c0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
1c0d0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
1c0e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c0f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
1c110 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
1c120 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
1c130 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
1c140 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
1c150 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
1c160 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1c170 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
1c180 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
1c190 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1c1a0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
1c1b0 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
1c1c0 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
1c1d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
1c1e0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
1c1f0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
1c200 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
1c210 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1c220 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a  ne(pPage1);.  }.
1c230 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
1c240 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
1c250 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
1c260 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
1c270 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
1c280 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
1c290 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
1c2a0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
1c2b0 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
1c2c0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1c2d0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
1c2e0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1c2f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
1c300 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c310 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
1c320 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c330 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c340 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1c350 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
1c360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1c380 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
1c390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
1c3a0 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
1c3b0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
1c3c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c3d0 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
1c3e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1c3f0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
1c400 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
1c410 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
1c420 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
1c430 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
1c440 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
1c450 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
1c460 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
1c470 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
1c480 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
1c490 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
1c4a0 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
1c4b0 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
1c4c0 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
1c4d0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
1c4e0 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
1c4f0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
1c500 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
1c510 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
1c520 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
1c530 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
1c540 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
1c550 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
1c560 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
1c570 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
1c580 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
1c590 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
1c5a0 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
1c5b0 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
1c5c0 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
1c5d0 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
1c5e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
1c5f0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
1c600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c610 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1c620 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1c630 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
1c640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
1c650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1c660 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
1c670 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
1c680 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
1c690 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1c6a0 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
1c6b0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
1c6c0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
1c6d0 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
1c6e0 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
1c6f0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
1c700 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
1c710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c720 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
1c730 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
1c740 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1c750 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
1c760 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
1c770 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
1c780 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
1c790 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
1c7a0 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
1c7b0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
1c7c0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
1c7d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1c7e0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1c7f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c800 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
1c810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1c820 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1c830 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
1c840 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
1c850 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
1c860 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
1c870 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1c880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c890 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
1c8a0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
1c8b0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
1c8c0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1c8d0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
1c8e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1c8f0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
1c900 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
1c910 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1c920 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1c930 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
1c940 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
1c950 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1c960 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
1c970 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
1c980 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
1c990 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
1c9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c9b0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
1c9c0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
1c9d0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
1c9e0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
1c9f0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1ca00 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
1ca10 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
1ca20 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
1ca30 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
1ca40 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
1ca50 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
1ca60 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1ca70 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1ca80 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
1ca90 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
1caa0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
1cab0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
1cac0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
1cad0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
1cae0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1caf0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
1cb00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
1cb10 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
1cb20 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1cb30 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1cb40 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
1cb50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1cb60 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
1cb70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
1cb80 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
1cb90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
1cba0 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
1cbb0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
1cbc0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1cbd0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
1cbe0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
1cbf0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
1cc00 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
1cc10 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
1cc20 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
1cc30 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
1cc40 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
1cc50 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
1cc60 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
1cc70 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
1cc80 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
1cc90 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
1cca0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
1ccb0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
1ccc0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
1ccd0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1cce0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
1ccf0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
1cd00 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
1cd10 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
1cd20 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
1cd30 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
1cd40 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
1cd50 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
1cd60 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
1cd70 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
1cd80 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
1cd90 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
1cda0 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
1cdb0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
1cdc0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
1cdd0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
1cde0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
1cdf0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
1ce00 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
1ce10 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
1ce20 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
1ce30 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
1ce40 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
1ce50 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
1ce60 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
1ce70 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
1ce80 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
1ce90 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
1cea0 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
1ceb0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
1cec0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
1ced0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
1cee0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
1cef0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
1cf00 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
1cf10 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
1cf20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1cf30 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
1cf40 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
1cf50 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  lag){.  BtShared
1cf60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1cf70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cf80 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 43 6f 6e  E_OK;.  int bCon
1cf90 63 75 72 72 65 6e 74 20 3d 20 28 70 2d 3e 64 62  current = (p->db
1cfa0 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26  ->bConcurrent &&
1cfb0 20 21 49 53 41 55 54 4f 56 41 43 55 55 4d 29 3b   !ISAUTOVACUUM);
1cfc0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1cfd0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1cfe0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1cff0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1d000 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1d010 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1d020 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1d030 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1d040 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1d050 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1d060 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1d070 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1d080 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1d090 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1d0a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1d0b0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1d0c0 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1d0d0 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1d0e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1d0f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1d100 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1d110 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1d120 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1d130 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1d140 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1d150 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1d160 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1d170 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1d180 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1d190 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1d1a0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1d1b0 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1d1c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1d1d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1d1e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1d1f0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1d200 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1d210 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1d220 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1d230 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1d240 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1d250 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1d260 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1d270 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1d280 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1d290 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1d2a0 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1d2b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1d2c0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1d2d0 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1d2e0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1d2f0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1d300 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1d310 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d320 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1d330 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1d340 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1d350 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1d360 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1d370 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1d380 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1d390 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1d3a0 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1d3b0 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1d3c0 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1d3d0 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1d3e0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1d3f0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1d400 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1d410 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1d420 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1d430 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1d440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d450 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1d460 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1d470 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1d480 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1d490 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d4a0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1d4b0 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1d4c0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1d4d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1d4e0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1d4f0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1d500 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1d510 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1d520 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1d530 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1d540 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1d550 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1d560 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1d570 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1d580 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d590 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1d5a0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1d5b0 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1d5c0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1d5d0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1d5e0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1d5f0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1d600 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1d610 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1d620 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1d630 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1d640 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1d650 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1d660 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1d670 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1d680 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1d690 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1d6a0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1d6b0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1d6c0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1d6d0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1d6e0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1d6f0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1d700 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1d710 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1d720 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1d730 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1d740 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1d750 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1d760 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1d770 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1d780 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1d790 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1d7a0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1d7b0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1d7c0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1d7d0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1d7e0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1d7f0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1d800 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1d810 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1d820 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1d830 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1d840 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1d850 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1d860 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1d870 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1d880 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1d890 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1d8a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d8b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1d8c0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1d8d0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  e{.        int e
1d8e0 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63 75 72 72  xFlag = bConcurr
1d8f0 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77 72 66 6c  ent ? -1 : (wrfl
1d900 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ag>1);.        r
1d910 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d920 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
1d930 72 2c 20 65 78 46 6c 61 67 2c 20 73 71 6c 69 74  r, exFlag, sqlit
1d940 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1d950 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
1d960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d980 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1d990 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
1d9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d9b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d9c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d9d0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1d9e0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
1d9f0 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
1da00 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
1da10 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1da20 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1da30 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
1da40 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
1da50 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
1da60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1da70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1da80 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1da90 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
1daa0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1dab0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
1dac0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1dad0 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
1dae0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1daf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1db00 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
1db10 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
1db20 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1db30 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
1db40 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
1db50 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
1db60 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1db70 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
1db80 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
1db90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1dba0 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
1dbb0 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
1dbc0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
1dbd0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
1dbe0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
1dbf0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1dc00 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1dc10 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
1dc20 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
1dc30 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
1dc40 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1dc50 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1dc60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1dc70 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1dc80 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
1dc90 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
1dca0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
1dcb0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
1dcc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1dcd0 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
1dce0 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
1dcf0 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
1dd00 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
1dd10 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
1dd20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
1dd30 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
1dd40 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
1dd50 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
1dd60 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
1dd70 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
1dd80 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
1dd90 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
1dda0 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
1ddb0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
1ddc0 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
1ddd0 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
1dde0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ddf0 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
1de00 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
1de10 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1de20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
1de30 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
1de40 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
1de50 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
1de60 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
1de70 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1de80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1de90 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
1dea0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1deb0 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
1dec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ded0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1dee0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1def0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1df00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1df10 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1df20 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1df30 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1df40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1df50 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
1df60 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66 20 53  begun:.#ifndef S
1df70 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
1df80 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43 6f 6e  RRENT.  if( bCon
1df90 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d 3d 53  current && rc==S
1dfa0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
1dfb0 74 65 33 50 61 67 65 72 49 73 57 61 6c 28 70 42  te3PagerIsWal(pB
1dfc0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
1dfd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dfe0 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72 72 65  gerBeginConcurre
1dff0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
1e000 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e010 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1e020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
1e030 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61  treePtrmapAlloca
1e040 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  te(pBt);.    }. 
1e050 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
1e060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e070 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1e080 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1e090 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1e0a0 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1e0b0 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1e0c0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
1e0d0 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1e0e0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1e0f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e100 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
1e110 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1e120 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1e130 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1e140 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1e150 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
1e160 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 64  Savepoint = p->d
1e170 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->nSavepoint;. 
1e180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e190 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1e1a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
1e1b0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1e1c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e1d0 4b 20 26 26 20 6e 53 61 76 65 70 6f 69 6e 74 20  K && nSavepoint 
1e1e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
1e1f0 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70  reePtrmapBegin(p
1e200 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b  Bt, nSavepoint);
1e210 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
1e220 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1e230 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1e240 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1e250 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1e260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e270 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
1e280 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
1e290 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1e2a0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1e2b0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
1e2c0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
1e2d0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
1e2e0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1e2f0 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
1e300 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
1e310 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
1e320 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1e330 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
1e340 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
1e350 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
1e360 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e390 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
1e3a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e3d0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
1e3e0 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
1e3f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e420 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1e430 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1e440 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
1e450 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
1e460 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e470 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1e480 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1e490 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69  .  rc = pPage->i
1e4a0 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f  sInit ? SQLITE_O
1e4b0 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67  K : btreeInitPag
1e4c0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1e4d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e4e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1e4f0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1e500 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1e510 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1e520 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1e530 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1e540 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1e550 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1e560 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1e570 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1e580 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1e590 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1e5a0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1e5b0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1e5c0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1e5d0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1e5e0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1e5f0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1e600 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1e610 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1e620 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1e630 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e640 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1e650 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1e660 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1e670 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1e680 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e690 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1e6a0 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1e6b0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1e6c0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1e6d0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1e6e0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1e6f0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1e700 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1e710 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1e720 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1e730 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1e740 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1e750 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1e760 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1e770 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1e780 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1e790 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e7b0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1e7c0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1e7d0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1e7e0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1e7f0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1e800 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1e810 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e820 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1e830 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1e840 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1e850 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1e860 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1e870 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1e880 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1e890 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1e8a0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1e8b0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1e8c0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1e8d0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1e8e0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1e8f0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1e900 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1e910 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1e920 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1e930 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e940 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1e950 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1e960 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1e970 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1e980 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1e990 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1e9a0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1e9b0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1e9c0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1e9d0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1e9e0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1e9f0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1ea00 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1ea10 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1ea20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ea30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ea40 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
1ea50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1ea60 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1ea70 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1ea80 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1ea90 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1eaa0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1eab0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1eac0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1ead0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1eae0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1eaf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1eb00 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1eb10 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1eb20 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1eb30 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1eb40 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1eb50 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1eb60 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1eb70 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1eb80 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1eb90 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1eba0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1ebb0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1ebc0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1ebd0 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1ebe0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
1ebf0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1ec00 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
1ec10 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1ec20 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
1ec30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1ec40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ec50 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
1ec60 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1ec70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec80 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
1ec90 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1eca0 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20  .nSize-4) ){.   
1ecb0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ecc0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1ecd0 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20  ze-4, iTo);.    
1ece0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ecf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ed00 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1ed10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1ed20 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1ed30 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1ed40 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1ed50 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1ed60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1ed70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ed80 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1ed90 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1eda0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1edb0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1edc0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1edd0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1ede0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1edf0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1ee00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ee10 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
1ee20 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
1ee30 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1ee40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1ee50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1ee60 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1ee70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ee80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1ee90 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1eea0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1eeb0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1eec0 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1eed0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1eee0 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1eef0 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1ef00 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1ef10 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1ef20 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1ef30 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1ef40 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1ef50 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1ef60 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1ef70 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1ef80 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1ef90 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1efa0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1efb0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1efc0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1efd0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1efe0 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1eff0 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1f000 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1f010 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1f020 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1f030 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1f040 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1f050 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1f060 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f080 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1f090 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1f0a0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1f0b0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1f0c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1f0d0 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1f0e0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1f0f0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1f100 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1f110 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1f120 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1f130 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f150 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1f160 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1f170 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1f180 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1f190 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1f1a0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1f1b0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1f1c0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1f1d0 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1f1e0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1f1f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1f200 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1f210 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1f220 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1f230 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1f240 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1f250 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1f260 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1f270 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1f280 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1f290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f2a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1f2b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f2c0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1f2d0 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
1f2e0 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
1f2f0 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
1f300 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
1f310 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
1f320 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
1f330 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
1f340 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
1f350 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
1f360 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
1f370 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
1f380 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
1f390 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
1f3a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f3b0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
1f3c0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
1f3d0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1f3e0 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
1f3f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f400 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1f410 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
1f420 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
1f430 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
1f440 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
1f450 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
1f460 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
1f470 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
1f480 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
1f490 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1f4a0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
1f4b0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1f4c0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
1f4d0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
1f4e0 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
1f4f0 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
1f500 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
1f510 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
1f520 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
1f530 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
1f540 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
1f550 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
1f560 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1f570 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
1f580 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
1f590 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1f5a0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
1f5b0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1f5c0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1f5d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1f5e0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1f5f0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1f600 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
1f610 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
1f620 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1f630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f640 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f650 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1f660 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
1f670 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
1f680 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
1f690 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
1f6a0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1f6b0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
1f6c0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1f6d0 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
1f6e0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1f6f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f720 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
1f730 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
1f740 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
1f750 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
1f760 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
1f770 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
1f780 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
1f790 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
1f7a0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
1f7b0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
1f7c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1f7d0 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
1f7e0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1f7f0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1f800 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
1f810 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
1f820 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f830 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1f840 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f860 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
1f870 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1f880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f890 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1f8a0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1f8b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f8c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1f8d0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1f8e0 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
1f8f0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1f900 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
1f910 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1f920 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1f930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f940 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1f950 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1f960 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
1f970 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1f980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f990 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1f9a0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1f9b0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1f9c0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
1f9d0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1f9e0 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
1f9f0 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
1fa00 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
1fa10 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
1fa20 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
1fa30 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1fa40 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
1fa50 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
1fa60 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1fa70 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
1fa80 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
1fa90 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
1faa0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
1fab0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
1fac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1fad0 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
1fae0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1faf0 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
1fb00 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
1fb10 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
1fb20 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
1fb30 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1fb40 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
1fb50 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
1fb60 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1fb70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
1fb80 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1fb90 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
1fba0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
1fbb0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
1fbc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1fbd0 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
1fbe0 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
1fbf0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
1fc00 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1fc10 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1fc20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
1fc30 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
1fc40 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
1fc50 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
1fc60 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
1fc70 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
1fc80 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
1fc90 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
1fca0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
1fcb0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1fcc0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
1fcd0 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
1fce0 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
1fcf0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
1fd00 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
1fd10 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
1fd20 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
1fd30 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
1fd40 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
1fd50 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
1fd60 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
1fd70 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
1fd80 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1fd90 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
1fda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fdb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1fdc0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
1fdd0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
1fde0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1fdf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1fe00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1fe10 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
1fe20 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
1fe30 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
1fe40 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
1fe50 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
1fe60 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1fe70 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
1fe80 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
1fe90 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
1fea0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
1feb0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fec0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
1fed0 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
1fee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fef0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1ff00 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1ff10 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
1ff20 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
1ff30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ff40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ff50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ff60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
1ff70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1ff80 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
1ff90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ffa0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1ffb0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1ffc0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1ffd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
1ffe0 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1fff0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
20000 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
20010 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
20020 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
20030 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
20040 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
20050 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
20060 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
20070 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
20080 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
20090 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
200a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
200b0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
200c0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
200d0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
200e0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
200f0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
20100 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20110 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
20120 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
20130 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
20140 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
20150 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
20160 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
20170 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
20180 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
20190 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
201a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
201b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
201c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
201d0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
201e0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
201f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20200 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
20210 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
20220 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
20230 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
20240 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
20250 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
20260 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
20270 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
20280 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
20290 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
202a0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
202b0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
202c0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
202d0 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
202e0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
202f0 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
20300 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
20310 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
20320 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
20330 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
20340 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
20350 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20370 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20380 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
20390 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
203a0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
203b0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
203c0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
203d0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
203e0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
203f0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
20400 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
20410 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
20420 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
20430 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
20440 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
20450 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
20460 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
20470 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
20480 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
20490 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
204a0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
204b0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
204c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
204d0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
204e0 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
204f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
20500 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
20510 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
20520 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
20530 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
20540 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
20550 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
20560 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
20570 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
20580 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
20590 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
205a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
205b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
205c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
205d0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
205e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
205f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
20600 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
20610 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
20620 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
20630 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
20640 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
20650 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
20660 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
20670 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
20680 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
20690 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
206a0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
206b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
206c0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
206d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
206e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
206f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
20700 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
20710 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
20720 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
20730 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
20740 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
20750 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20760 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
20770 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
20780 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
20790 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
207a0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
207b0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
207c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
207d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
207e0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
207f0 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
20800 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
20810 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
20820 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
20830 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
20840 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
20850 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
20860 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
20870 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20880 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
20890 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
208a0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
208b0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
208c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
208d0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
208e0 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
208f0 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
20900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20910 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20920 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
20930 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
20940 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20970 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
20980 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
20990 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
209b0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
209c0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
209d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
209e0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
209f0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
20a00 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
20a10 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
20a20 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
20a30 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
20a40 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
20a50 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
20a60 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
20a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20a80 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
20a90 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
20aa0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
20ab0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
20ac0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
20ad0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
20ae0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
20af0 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
20b00 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
20b10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
20b20 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
20b30 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
20b40 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
20b50 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
20b60 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
20b70 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
20b80 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
20b90 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
20ba0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
20bb0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
20bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
20bd0 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
20be0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
20bf0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
20c00 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
20c10 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
20c20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
20c30 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
20c40 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
20c50 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
20c60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
20c70 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
20c80 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
20c90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20ca0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
20cb0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
20cc0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
20cd0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
20ce0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
20cf0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20d00 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
20d10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20d20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
20d30 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
20d40 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
20d50 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
20d60 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
20d70 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
20d80 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20d90 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
20da0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
20db0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
20dc0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
20dd0 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
20de0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20df0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20e00 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
20e10 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
20e20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
20e30 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
20e40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20e60 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
20e70 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
20e80 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
20e90 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
20ea0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
20eb0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
20ec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20ee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20ef0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
20f00 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20f10 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20f20 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20f30 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
20f40 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
20f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
20f70 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
20f80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20f90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
20fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20fb0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
20fc0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
20fd0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
20fe0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
20ff0 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
21000 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
21010 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
21020 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
21030 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
21040 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
21050 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
21060 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
21070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
21080 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
21090 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
210a0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
210b0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
210c0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
210d0 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
210e0 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
210f0 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
21100 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
21110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
21120 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
21130 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
21140 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21150 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
21160 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
21170 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
21180 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
21190 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
211a0 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61  (pPager); )..  a
211b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
211c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
211d0 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
211e0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
211f0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
21200 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
21210 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
21220 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
21230 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
21240 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21250 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
21260 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
21270 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
21280 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
21290 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
212a0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
212b0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
212c0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
212d0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
212e0 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
212f0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
21300 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
21310 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
21320 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
21330 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
21340 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
21350 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
21360 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
21370 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
21380 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
21390 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
213a0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
213b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
213c0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
213d0 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
213e0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
213f0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
21400 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
21410 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
21420 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
21430 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
21440 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
21450 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
21460 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
21470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21480 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21490 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
214a0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
214b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
214c0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
214d0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
214e0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
214f0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
21500 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
21510 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21520 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
21530 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
21540 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
21550 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
21560 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
21570 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
21580 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
21590 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
215a0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
215b0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
215c0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
215d0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
215e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
215f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
21600 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
21610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21620 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
21630 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
21640 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
21650 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
21660 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
21670 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
21680 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
21690 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
216a0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
216b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
216c0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
216d0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
216e0 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
216f0 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
21700 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
21710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21720 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
21730 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
21740 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
21750 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
21760 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
21770 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
21780 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
21790 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
217a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
217b0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
217c0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
217d0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
217e0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
217f0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
21800 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  T./*.** This fun
21810 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
21820 61 73 20 70 61 72 74 20 6f 66 20 6d 65 72 67 69  as part of mergi
21830 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54  ng an CONCURRENT
21840 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74   transaction wit
21850 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73 68 6f  h.** the snapsho
21860 74 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66  t at the head of
21870 20 74 68 65 20 77 61 6c 20 66 69 6c 65 2e 20 49   the wal file. I
21880 74 20 72 65 6c 6f 63 61 74 65 73 20 61 6c 6c 20  t relocates all 
21890 70 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pages in the.** 
218a0 72 61 6e 67 65 20 69 46 69 72 73 74 2e 2e 69 4c  range iFirst..iL
218b0 61 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20  ast, inclusive. 
218c0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
218d0 61 74 20 74 68 65 20 42 74 72 65 65 50 74 72 6d  at the BtreePtrm
218e0 61 70 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ap .** structure
218f0 20 61 74 20 42 74 53 68 61 72 65 64 2e 70 4d 61   at BtShared.pMa
21900 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  p contains the l
21910 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ocation of the p
21920 6f 69 6e 74 65 72 73 20 74 6f 20 65 61 63 68 0a  ointers to each.
21930 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 72  ** page in the r
21940 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ange..**.** If p
21950 6e 43 75 72 72 65 6e 74 20 69 73 20 4e 55 4c 4c  nCurrent is NULL
21960 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
21970 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 61 72   in the range ar
21980 65 20 6d 6f 76 65 64 20 74 6f 20 63 75 72 72 65  e moved to curre
21990 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c 6f 63  ntly.** free loc
219a0 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66 72 65  ations (i.e. fre
219b0 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29 20  e-list entries) 
219c0 77 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62  within the datab
219d0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
219e0 70 61 67 65 0a 2a 2a 20 69 46 69 72 73 74 2e 0a  page.** iFirst..
219f0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70 6e 43  **.** Or, if pnC
21a00 75 72 72 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  urrent is not NU
21a10 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e  LL, then it poin
21a20 74 73 20 74 6f 20 61 20 76 61 6c 75 65 20 63 6f  ts to a value co
21a30 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ntaining the.** 
21a40 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
21a50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21a60 65 20 69 6e 20 70 61 67 65 73 2e 20 49 6e 20 74  e in pages. In t
21a70 68 69 73 20 63 61 73 65 2c 20 61 6c 6c 20 70 61  his case, all pa
21a80 67 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c 6f 63  ges are.** reloc
21a90 61 74 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20  ated to the end 
21aa0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21ab0 66 69 6c 65 20 2d 20 70 61 67 65 20 69 46 69 72  file - page iFir
21ac0 73 74 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  st is relocated 
21ad0 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70 6e 43  to.** page (*pnC
21ae0 75 72 72 65 6e 74 2b 31 29 2c 20 70 61 67 65 20  urrent+1), page 
21af0 69 46 69 72 73 74 2b 31 20 74 6f 20 70 61 67 65  iFirst+1 to page
21b00 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32 29 2c   (*pnCurrent+2),
21b10 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 56   and so on..** V
21b20 61 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e 74 20  alue *pnCurrent 
21b30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 65  is set to the ne
21b40 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  w size of the da
21b50 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
21b60 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
21b70 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
21b80 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
21b90 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
21ba0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
21bb0 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
21bc0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
21bd0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
21be0 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a 20 20 42  locateRange(.  B
21bf0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c10 2a 20 42 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  * B-tree handle 
21c20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74  */.  Pgno iFirst
21c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21c40 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
21c50 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a  ge to relocate *
21c60 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 2c 20  /.  Pgno iLast, 
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c80 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65      /* Last page
21c90 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a   to relocate */.
21ca0 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72 65 6e    Pgno *pnCurren
21cb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
21cc0 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
21cd0 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61 62 61  , IN/OUT: Databa
21ce0 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  se size */.){.  
21cf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21d00 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  OK;.  BtreePtrma
21d10 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
21d20 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50 67 3b  Map;.  Pgno iPg;
21d30 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69 46 69 72  ..  for(iPg=iFir
21d40 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20 26  st; iPg<=iLast &
21d50 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
21d60 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d   iPg++){.    Mem
21d70 50 61 67 65 20 2a 70 46 72 65 65 20 3d 20 30 3b  Page *pFree = 0;
21d80 20 20 20 20 20 2f 2a 20 50 61 67 65 20 61 6c 6c       /* Page all
21d90 6f 63 61 74 65 64 20 66 72 6f 6d 20 66 72 65 65  ocated from free
21da0 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d 65 6d  -list */.    Mem
21db0 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
21dc0 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20 20 20     Pgno iNew;   
21dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21de0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  w page number fo
21df0 72 20 70 50 67 20 2a 2f 0a 20 20 20 20 50 74 72  r pPg */.    Ptr
21e00 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  mapEntry *pEntry
21e10 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
21e20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
21e30 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20 20 69  ge iPg */..    i
21e40 66 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  f( iPg==PENDING_
21e50 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
21e60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
21e70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61  Entry = &pMap->a
21e80 50 74 72 5b 69 50 67 20 2d 20 70 4d 61 70 2d 3e  Ptr[iPg - pMap->
21e90 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20 69 66  iFirst];..    if
21ea0 28 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d  ( pEntry->eType=
21eb0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
21ec0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 64   ){.      Pgno d
21ed0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  ummy;.      rc =
21ee0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
21ef0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20  ge(pBt, &pFree, 
21f00 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42 54 41  &dummy, iPg, BTA
21f10 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
21f20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
21f30 46 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Free);.      ass
21f40 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21f50 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67  OK || dummy==iPg
21f60 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
21f70 28 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20  ( pnCurrent ){. 
21f80 20 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67       btreeGetPag
21f90 65 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67  e(pBt, iPg, &pPg
21fa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
21fb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
21fc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 67 2d  Iswriteable(pPg-
21fd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
21fe0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
21ff0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
22000 75 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67 65  unt(pPg->pDbPage
22010 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4e  )==1 );.      iN
22020 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
22030 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  nt);.      if( i
22040 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  New==PENDING_BYT
22050 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 69 4e  E_PAGE(pBt) ) iN
22060 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65  ew = ++(*pnCurre
22070 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
22080 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
22090 2c 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65  , pPg, pEntry->e
220a0 54 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61  Type, pEntry->pa
220b0 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a  rent, iNew, 1);.
220c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
220d0 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  eNotNull(pPg);. 
220e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
220f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
22100 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
22110 65 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72 73  ee, &iNew, iFirs
22120 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29  t-1, BTALLOC_LE)
22130 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
22150 20 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b 0a   iNew<iFirst );.
22160 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22180 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22190 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Free);.        b
221a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
221b0 20 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a   iPg, &pPg, 0);.
221c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
221d0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
221e0 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70  Pg, pEntry->eTyp
221f0 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e  e, pEntry->paren
22200 74 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20  t,iNew,1);.     
22210 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22220 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
22230 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22240 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e  rc;.}../* !defin
22250 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
22260 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
22270 20 54 68 65 20 62 2d 74 72 65 65 20 68 61 6e 64   The b-tree hand
22280 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
22290 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
222a0 73 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69  s about to commi
222b0 74 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45  t an.** CONCURRE
222c0 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  NT transaction. 
222d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
222e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
222f0 68 61 74 20 74 68 69 73 20 69 73 20 0a 2a 2a 20  hat this is .** 
22300 70 6f 73 73 69 62 6c 65 20 2d 20 74 68 65 20 77  possible - the w
22310 61 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 69  al WRITER lock i
22320 73 20 68 65 6c 64 20 61 6e 64 20 69 74 20 69 73  s held and it is
22330 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 72   known that ther
22340 65 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e  e are .** no con
22350 66 6c 69 63 74 73 20 77 69 74 68 20 63 6f 6d 6d  flicts with comm
22360 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
22370 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
22380 74 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b  t btreeFixUnlock
22390 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
223a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
223b0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
223c0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
223d0 3e 70 50 61 67 65 31 3b 0a 20 20 75 38 20 2a 70  >pPage1;.  u8 *p
223e0 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
223f0 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
22400 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
22410 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22420 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
22430 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
22440 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 77  atabase is not w
22450 72 69 74 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f  ritable, then no
22460 20 70 61 67 65 73 20 77 65 72 65 20 61 6c 6c 6f   pages were allo
22470 63 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72  cated.  ** or fr
22480 65 65 64 20 62 79 20 74 68 69 73 20 74 72 61 6e  eed by this tran
22490 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
224a0 20 63 61 73 65 20 6e 6f 20 73 70 65 63 69 61 6c   case no special
224b0 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20   handling is .  
224c0 2a 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  ** required. Oth
224d0 65 72 77 69 73 65 2c 20 69 66 20 70 61 67 65 20  erwise, if page 
224e0 31 20 69 73 20 64 69 72 74 79 2c 20 70 72 6f 63  1 is dirty, proc
224f0 65 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65  eed.  */.  Btree
22500 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
22510 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f  Bt->pMap;.  Pgno
22520 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
22530 74 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50  te(&p1[32]);.  P
22540 67 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74 72 65  gno nPage = btre
22550 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
22560 0a 20 20 75 33 32 20 6e 46 72 65 65 20 3d 20 67  .  u32 nFree = g
22570 65 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29  et4byte(&p1[36])
22580 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
22590 2d 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d  ->pMap );.  rc =
225a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67   sqlite3PagerUpg
225b0 72 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61  radeSnapshot(pPa
225c0 67 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62  ger, pPage1->pDb
225d0 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
225e0 20 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61   p1==pPage1->aDa
225f0 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ta );..  if( rc=
22600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22610 20 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20    Pgno nHPage = 
22620 67 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  get4byte(&p1[28]
22630 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
22640 20 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20 20   = nHPage;      
22650 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
22660 20 61 66 74 65 72 20 74 72 61 6e 73 61 63 74 69   after transacti
22670 6f 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20  on merge */..   
22680 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
22690 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
226a0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 7b  ge1->pDbPage) ){
226b0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54 72  .      Pgno iHTr
226c0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
226d0 70 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 75  p1[32]);.      u
226e0 33 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74 34  32 nHFree = get4
226f0 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
22700 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
22710 74 68 65 20 68 65 61 64 20 64 61 74 61 62 61 73  the head databas
22720 65 20 66 72 65 65 20 6c 69 73 74 20 74 6f 20 74  e free list to t
22730 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75  he end of the cu
22740 72 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  rrent.      ** t
22750 72 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 65 65  ransactions free
22760 2d 6c 69 73 74 20 28 69 66 20 61 6e 79 29 2e 20  -list (if any). 
22770 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 54   */.      if( iT
22780 72 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  runk!=0 ){.     
22790 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b     put4byte(&p1[
227a0 33 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20 6e 46  36], nHFree + nF
227b0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ree);.        pu
227c0 74 34 62 79 74 65 28 26 70 31 5b 33 32 5d 2c 20  t4byte(&p1[32], 
227d0 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
227e0 20 77 68 69 6c 65 28 20 69 54 72 75 6e 6b 20 29   while( iTrunk )
227f0 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
22800 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73 71 6c  ge *pTrunk = sql
22810 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
22820 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 29 3b  pPager, iTrunk);
22830 0a 20 20 20 20 20 20 20 20 20 20 69 54 72 75 6e  .          iTrun
22840 6b 20 3d 20 67 65 74 34 62 79 74 65 28 28 75 38  k = get4byte((u8
22850 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 29  *)pTrunk->pData)
22860 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22870 69 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20  iTrunk==0 ){.   
22880 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
22890 65 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70  e((u8*)pTrunk->p
228a0 44 61 74 61 2c 20 69 48 54 72 75 6e 6b 29 3b 0a  Data, iHTrunk);.
228b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
228c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
228d0 65 72 55 6e 72 65 66 28 70 54 72 75 6e 6b 29 3b  erUnref(pTrunk);
228e0 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  .        };.    
228f0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e    }..      if( n
22900 48 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69 46 69  HPage<(pMap->iFi
22910 72 73 74 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  rst-1) ){.      
22920 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
22930 65 20 63 6f 6e 73 69 73 74 65 64 20 6f 66 20 28  e consisted of (
22940 70 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20  pMap->iFirst-1) 
22950 70 61 67 65 73 20 77 68 65 6e 20 74 68 65 20 63  pages when the c
22960 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  urrent.        *
22970 2a 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61  * concurrent tra
22980 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
22990 6e 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f 6e 63  ned. And an conc
229a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
229b0 6f 6e 20 6d 61 79 0a 20 20 20 20 20 20 20 20 2a  on may.        *
229c0 2a 20 6e 6f 74 20 62 65 20 65 78 65 63 75 74 65  * not be execute
229d0 64 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63  d on an auto-vac
229e0 75 75 6d 20 64 61 74 61 62 61 73 65 20 2d 20 73  uum database - s
229f0 6f 20 74 68 65 20 64 62 20 73 68 6f 75 6c 64 20  o the db should 
22a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
22a10 68 61 76 65 20 73 68 72 75 6e 6b 20 73 69 6e 63  have shrunk sinc
22a20 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
22a30 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68  n was opened. Th
22a40 65 72 65 66 6f 72 65 20 6e 48 50 61 67 65 0a 20  erefore nHPage. 
22a50 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64         ** should
22a60 20 62 65 20 73 65 74 20 74 6f 20 28 70 4d 61 70   be set to (pMap
22a70 2d 3e 69 46 69 72 73 74 2d 31 29 20 6f 72 20 67  ->iFirst-1) or g
22a80 72 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20  reater. */.     
22a90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22aa0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22ab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22ac0 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
22ad0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c   transaction all
22ae0 6f 63 61 74 65 64 20 70 61 67 65 73 20 70 4d 61  ocated pages pMa
22af0 70 2d 3e 69 46 69 72 73 74 20 74 68 72 6f 75 67  p->iFirst throug
22b00 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 50 61  h.        ** nPa
22b10 67 65 20 28 69 6e 63 6c 75 73 69 76 65 29 20 61  ge (inclusive) a
22b20 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22b30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22b40 4d 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20  Meanwhile,.     
22b50 20 20 20 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e     ** other tran
22b60 73 61 63 74 69 6f 6e 73 20 68 61 76 65 20 61 6c  sactions have al
22b70 6c 6f 63 61 74 65 64 20 28 69 46 69 72 73 74 2e  located (iFirst.
22b80 2e 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76  .nHPage). So mov
22b90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
22ba0 65 73 20 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28  es (iFirst..MIN(
22bb0 6e 50 61 67 65 2c 6e 48 50 61 67 65 29 29 20 74  nPage,nHPage)) t
22bc0 6f 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50  o (MAX(nPage,nHP
22bd0 61 67 65 29 2b 31 29 2e 20 20 2a 2f 0a 20 20 20  age)+1).  */.   
22be0 20 20 20 20 20 50 67 6e 6f 20 69 4c 61 73 74 20       Pgno iLast 
22bf0 3d 20 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48 50  = MIN(nPage, nHP
22c00 61 67 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73 74  age);    /* Last
22c10 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
22c20 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 43  .        Pgno nC
22c30 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22c50 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
22c60 64 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43  db */.        nC
22c70 75 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e 50 61  urrent = MAX(nPa
22c80 67 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20 20  ge, nHPage);.   
22c90 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 52       rc = btreeR
22ca0 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74  elocateRange(pBt
22cb0 2c 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c 20  , pMap->iFirst, 
22cc0 69 4c 61 73 74 2c 20 26 6e 43 75 72 72 65 6e 74  iLast, &nCurrent
22cd0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
22ce0 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20  here are now no 
22cf0 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20  collisions with 
22d00 74 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20  the snapshot at 
22d10 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 0a  the head of the.
22d20 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
22d30 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 61 74 20  ase file. So at 
22d40 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
22d50 75 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65 20  uld be possible 
22d60 74 6f 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  to write.       
22d70 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
22d80 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ion out to disk.
22d90 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f   Before doing so
22da0 20 74 68 6f 75 67 68 2c 20 61 74 74 65 6d 70 74   though, attempt
22db0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   to.        ** r
22dc0 65 6c 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66 20  elocate some of 
22dd0 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 74 6f  the new pages to
22de0 20 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20   free locations 
22df0 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 0a  within the body.
22e00 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
22e10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22e20 28 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20  (i.e. free-list 
22e30 65 6e 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20 20  entries). */.   
22e40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22e60 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 75 72      assert( nCur
22e70 72 65 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42 59  rent!=PENDING_BY
22e80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
22e90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22ea0 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65 28  3PagerSetDbsize(
22eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43 75  pBt->pPager, nCu
22ec0 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  rrent);.        
22ed0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
22ee0 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20 20  te(&p1[36]);.   
22ef0 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 43         nFin = nC
22f00 75 72 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20 20  urrent-nFree;.  
22f10 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 75 72          if( nCur
22f20 72 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59 54  rent>PENDING_BYT
22f30 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
22f40 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
22f50 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
22f60 20 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 2d             nFin-
22f70 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  -;.          }. 
22f80 20 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20           nFin = 
22f90 4d 41 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67 65  MAX(nFin, nHPage
22fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
22fb0 3d 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52  = btreeRelocateR
22fc0 61 6e 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31  ange(pBt, nFin+1
22fd0 2c 20 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a  , nCurrent, 0);.
22fe0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
22ff0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b     put4byte(&p1[
23000 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
23010 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
23020 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73  lite3PagerSetDbs
23030 69 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69 6e  ize(pPager, nFin
23040 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
23050 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64   rc;.}.#else.# d
23060 65 66 69 6e 65 20 62 74 72 65 65 46 69 78 55 6e  efine btreeFixUn
23070 6c 6f 63 6b 65 64 28 58 29 20 20 53 51 4c 49 54  locked(X)  SQLIT
23080 45 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  E_OK.#endif /* S
23090 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
230a0 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RRENT */../*.** 
230b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
230c0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
230d0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
230e0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
230f0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
23100 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
23110 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
23120 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
23130 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
23140 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
23150 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
23160 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
23170 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
23180 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
23190 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
231a0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
231b0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
231c0 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
231d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
231e0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
231f0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
23200 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
23210 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
23220 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
23230 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
23240 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
23250 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
23260 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
23270 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
23280 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
23290 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
232a0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
232b0 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
232c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
232d0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
232e0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
232f0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
23300 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
23310 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
23320 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
23330 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
23340 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
23350 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
23360 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
23370 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
23380 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
23390 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
233a0 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
233b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
233c0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
233d0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
233e0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
233f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23400 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
23410 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
23420 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
23430 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
23440 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
23450 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
23460 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
23470 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
23480 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
23490 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
234a0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
234b0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
234c0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
234d0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
234e0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
234f0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
23500 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
23510 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
23520 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
23530 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
23540 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
23550 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
23560 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
23570 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
23580 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
23590 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
235a0 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
235b0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
235c0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
235d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
235e0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
235f0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
23600 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
23610 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
23620 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
23630 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
23640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23650 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
23660 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
23670 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
23680 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
23690 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
236a0 74 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66  ter(p);..#ifndef
236b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
236c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
236d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
236e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
236f0 20 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30   ISCONCURRENT==0
23700 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
23710 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
23720 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
23730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23750 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
23760 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
23770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23780 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
23790 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
237a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
237b0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
237c0 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
237d0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
237e0 69 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  if.    if( rc==S
237f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 43 4f  QLITE_OK && ISCO
23800 4e 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20  NCURRENT ){.    
23810 20 20 72 63 20 3d 20 62 74 72 65 65 46 69 78 55    rc = btreeFixU
23820 6e 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20 20  nlocked(p);.    
23830 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
23840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23860 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
23870 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
23880 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  aster, 0);.    }
23890 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
238a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
238b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
238c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
238d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
238e0 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
238f0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
23900 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
23910 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
23920 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
23930 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
23940 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
23950 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
23960 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
23970 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
23980 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23990 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
239a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
239b0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
239c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
239d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
239e0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
239f0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
23a00 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
23a10 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
23a20 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
23a30 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
23a40 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
23a50 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
23a60 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
23a70 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
23a80 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
23a90 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
23aa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
23ab0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
23ac0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
23ad0 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
23ae0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
23af0 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
23b00 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
23b10 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
23b20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
23b30 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
23b40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
23b50 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
23b60 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
23b70 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
23b80 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
23b90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
23ba0 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
23bb0 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
23bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
23bd0 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
23be0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
23bf0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
23c00 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
23c10 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
23c20 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
23c30 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
23c40 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
23c50 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
23c60 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
23c70 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
23c80 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
23c90 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
23ca0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
23cb0 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
23cc0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
23cd0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
23ce0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
23cf0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
23d00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23d10 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
23d20 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23d30 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
23d40 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
23d50 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
23d60 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
23d70 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
23d80 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
23d90 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
23da0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
23db0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
23dc0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
23dd0 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
23de0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
23df0 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72  an CONCURRENT tr
23e00 61 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74  ansaction, delet
23e10 65 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70 20  e the pBt->pMap 
23e20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c 73  object..  ** Als
23e30 6f 20 63 61 6c 6c 20 50 61 67 65 72 45 6e 64 43  o call PagerEndC
23e40 6f 6e 63 75 72 72 65 6e 74 28 29 20 74 6f 20 65  oncurrent() to e
23e50 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70  nsure that the p
23e60 61 67 65 72 20 68 61 73 20 64 69 73 63 61 72 64  ager has discard
23e70 65 64 0a 20 20 2a 2a 20 74 68 65 20 72 65 63 6f  ed.  ** the reco
23e80 72 64 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  rd of all pages 
23e90 72 65 61 64 20 77 69 74 68 69 6e 20 74 68 65 20  read within the 
23ea0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
23eb0 0a 20 20 62 74 72 65 65 50 74 72 6d 61 70 44 65  .  btreePtrmapDe
23ec0 6c 65 74 65 28 70 42 74 29 3b 0a 20 20 73 71 6c  lete(pBt);.  sql
23ed0 69 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63  ite3PagerEndConc
23ee0 75 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67  urrent(pBt->pPag
23ef0 65 72 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  er);.  btreeInte
23f00 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
23f10 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
23f20 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
23f30 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
23f40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23f50 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
23f60 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
23f70 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
23f80 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
23f90 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
23fa0 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
23fb0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
23fc0 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
23fd0 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
23fe0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
23ff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
24000 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
24010 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
24020 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
24030 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
24040 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
24050 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
24060 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
24070 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
24080 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
24090 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
240a0 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
240b0 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
240c0 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
240d0 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
240e0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
240f0 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
24100 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
24110 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
24120 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
24130 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
24140 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
24150 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
24160 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
24170 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
24180 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
24190 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
241a0 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
241b0 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
241c0 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
241d0 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
241e0 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
241f0 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
24200 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
24210 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
24220 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24230 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
24240 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
24250 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
24260 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
24270 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
24280 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
24290 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
242a0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
242b0 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
242c0 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
242d0 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
242e0 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
242f0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
24300 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
24310 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
24320 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
24330 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24340 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
24350 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
24360 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
24370 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
24380 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
24390 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
243a0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
243b0 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
243c0 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
243d0 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
243e0 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
243f0 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
24400 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
24410 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
24420 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
24430 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
24440 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
24450 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
24460 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
24470 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
24480 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
24490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
244a0 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
244b0 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
244c0 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
244d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
244e0 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
244f0 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
24500 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
24510 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
24520 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
24530 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
24540 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
24550 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
24560 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
24570 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
24580 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
24590 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
245a0 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
245b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
245c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
245d0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
245e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
245f0 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
24600 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
24610 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
24620 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
24630 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
24640 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
24650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
24660 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
24670 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
24680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24690 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
246a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
246b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
246c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
246d0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
246e0 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
246f0 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
24700 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
24710 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
24720 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
24730 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
24740 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
24750 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
24760 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
24770 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
24780 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24790 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
247a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
247b0 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
247c0 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
247d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
247e0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
247f0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
24800 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24810 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
24820 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
24830 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
24840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24850 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
24860 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
24870 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
24880 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
24890 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
248a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
248b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
248c0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
248d0 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
248e0 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
248f0 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
24900 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
24910 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
24920 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
24930 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
24940 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
24950 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
24960 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
24970 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
24980 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
24990 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
249a0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
249b0 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
249c0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
249d0 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
249e0 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
249f0 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
24a00 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
24a10 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
24a20 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
24a30 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
24a40 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
24a50 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
24a60 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
24a70 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
24a80 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
24a90 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
24aa0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
24ab0 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
24ac0 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
24ad0 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
24ae0 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
24af0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
24b00 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
24b10 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
24b20 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
24b30 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
24b40 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
24b50 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
24b60 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
24b70 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
24b80 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
24b90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
24ba0 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
24bb0 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
24bc0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
24bd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
24be0 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
24bf0 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
24c00 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
24c10 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
24c20 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
24c30 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
24c40 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
24c50 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
24c60 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
24c70 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
24c80 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
24c90 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
24ca0 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
24cb0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
24cc0 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
24cd0 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
24ce0 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
24cf0 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
24d00 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
24d10 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
24d20 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
24d30 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
24d40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24d50 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
24d60 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
24d70 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
24d80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
24d90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
24da0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
24db0 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
24dc0 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
24dd0 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
24de0 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
24df0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
24e00 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
24e10 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
24e20 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
24e30 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
24e40 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
24e50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24e60 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
24e70 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
24e80 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
24e90 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
24ea0 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e       if( writeOn
24eb0 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61  ly && (p->curFla
24ec0 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
24ed0 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lag)==0 ){.     
24ee0 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
24ef0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
24f00 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
24f10 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
24f20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
24f30 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
24f40 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(p);.          
24f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24f60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
24f70 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74   (void)sqlite3Bt
24f80 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
24f90 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29  s(pBtree, rc, 0)
24fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
24fb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
24fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24fe0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
24ff0 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
25000 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
25010 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
25020 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78        p->skipNex
25030 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20  t = errCode;.   
25040 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65     }.      btree
25050 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
25060 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a  Pages(p);.    }.
25070 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
25080 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
25090 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
250a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
250b0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
250c0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  n in progress..*
250d0 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65  *.** If tripCode
250e0 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
250f0 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77  K then cursors w
25100 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
25110 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a  ed (tripped)..**
25120 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
25130 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20  ors are tripped 
25140 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
25150 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72  true but all cur
25160 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70  sors are.** trip
25170 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
25180 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20   is false.  Any 
25190 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a  attempt to use.*
251a0 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73  * a tripped curs
251b0 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  or will result i
251c0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
251d0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
251e0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
251f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
25200 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
25210 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
25220 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
25230 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
25240 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
25250 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25260 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
25270 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c  p, int tripCode,
25280 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
25290 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
252a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
252b0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
252c0 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
252d0 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20  t( writeOnly==1 
252e0 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  || writeOnly==0 
252f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69  );.  assert( tri
25300 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42  pCode==SQLITE_AB
25310 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  ORT_ROLLBACK || 
25320 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
25330 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
25340 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
25350 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
25360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25370 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
25380 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
25390 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
253a0 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c  f( rc ) writeOnl
253b0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
253c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
253d0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
253e0 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  ipCode ){.    in
253f0 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42  t rc2 = sqlite3B
25400 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
25410 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  rs(p, tripCode, 
25420 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20  writeOnly);.    
25430 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
25440 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f  TE_OK || (writeO
25450 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53  nly==0 && rc2==S
25460 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20  QLITE_OK) );.   
25470 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
25480 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
25490 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67    }.  btreeInteg
254a0 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
254b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
254c0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
254d0 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
254e0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
254f0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
25500 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
25510 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
25520 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
25530 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
25540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25550 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
25560 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
25570 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
25580 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
25590 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
255a0 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
255b0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
255c0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
255d0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
255e0 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
255f0 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
25600 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
25610 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
25620 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
25630 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
25640 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
25650 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
25660 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
25670 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
25680 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
25690 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
256a0 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
256b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
256c0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
256d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
256e0 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
256f0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
25700 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
25710 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
25720 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
25730 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
25740 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
25750 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
25760 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
25770 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
25780 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
25790 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
257a0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
257b0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
257c0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
257d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
257e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
257f0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
25800 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
25810 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
25820 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
25830 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
25840 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
25850 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
25860 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
25870 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
25880 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
25890 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
258a0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
258b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
258c0 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
258d0 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
258e0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
258f0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
25900 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
25910 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
25920 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
25930 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
25940 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
25950 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
25960 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
25970 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
25980 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
25990 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
259a0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
259b0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
259c0 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
259d0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
259e0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
259f0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
25a00 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
25a10 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
25a20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
25a30 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
25a40 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
25a50 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
25a60 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
25a70 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
25a80 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
25a90 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
25aa0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
25ab0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
25ac0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
25ad0 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
25ae0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
25af0 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
25b00 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
25b10 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
25b20 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
25b30 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
25b40 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
25b50 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
25b60 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
25b70 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
25b80 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
25b90 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
25ba0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
25bb0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
25bc0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
25bd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25be0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
25bf0 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
25c00 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
25c10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
25c20 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
25c30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
25c40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
25c50 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
25c60 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
25c70 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
25c80 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
25c90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25ca0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
25cb0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
25cc0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
25cd0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
25ce0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
25cf0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
25d00 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
25d10 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
25d20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
25d30 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
25d40 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
25d50 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
25d60 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
25d70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
25d80 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
25d90 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
25da0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
25db0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
25dc0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
25dd0 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
25de0 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
25df0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
25e00 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
25e10 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
25e20 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
25e30 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
25e40 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
25e50 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 69  iStatement);.  i
25e60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25e70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
25e80 65 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70 42  eePtrmapBegin(pB
25e90 74 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  t, iStatement);.
25ea0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
25eb0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
25ec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25ed0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
25ee0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
25ef0 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
25f00 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
25f10 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
25f20 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
25f30 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
25f40 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
25f50 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
25f60 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
25f70 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
25f80 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
25f90 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
25fa0 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
25fb0 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
25fc0 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
25fd0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
25fe0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
25ff0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
26000 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
26010 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
26020 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
26030 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
26040 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
26050 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
26060 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
26070 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
26080 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
26090 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
260a0 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
260b0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
260c0 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
260d0 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
260e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
260f0 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
26100 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
26110 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
26120 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
26130 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
26140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26150 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
26160 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
26170 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
26180 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
26190 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
261a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
261b0 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
261c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
261d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
261e0 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
261f0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
26200 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
26210 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
26220 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
26230 65 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65 65  er(p);.    btree
26240 50 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20 6f  PtrmapEnd(pBt, o
26250 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
26260 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
26270 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
26280 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
26290 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
262a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
262b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
262c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
262d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
262e0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
262f0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
26300 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
26310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26320 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
26330 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
26340 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
26350 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
26360 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
26370 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
26380 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
26390 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
263a0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
263b0 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
263c0 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
263d0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
263e0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
263f0 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
26400 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
26410 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
26420 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
26430 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
26440 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
26450 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
26460 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
26470 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
26480 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
26490 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
264a0 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
264b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
264c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
264d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
264e0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
264f0 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
26500 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
26510 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
26520 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
26530 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
26540 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
26550 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
26560 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
26570 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
26580 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
26590 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
265a0 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
265b0 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
265c0 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
265d0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
265e0 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
265f0 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
26600 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
26610 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
26620 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52  **.** If the BTR
26630 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20  EE_WRCSR bit of 
26640 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  wrFlag is clear,
26650 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
26660 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20   can only.** be 
26670 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
26680 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  .  If the BTREE_
26690 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74  WRCSR bit is set
266a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
266b0 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  r.** can be used
266c0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
266d0 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f  for writing if o
266e0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
266f0 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61  for writing.** a
26700 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
26710 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64  ese are the cond
26720 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
26730 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
26740 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20  .** for writing 
26750 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  to be allowed:.*
26760 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
26770 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
26780 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
26790 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67  rFlag containing
267a0 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a   BTREE_WRCSR.**.
267b0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
267c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
267d0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
267e0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
267f0 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
26800 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
26810 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
26820 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
26830 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
26840 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
26850 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
26860 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
26870 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
26880 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
26890 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
268a0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
268b0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
268c0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
268d0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
268e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
268f0 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
26900 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
26910 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
26920 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
26930 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
26940 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
26950 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
26960 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45  ..**.** The BTRE
26970 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20  E_FORDELETE bit 
26980 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70  of wrFlag may op
26990 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20  tionally be set 
269a0 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  if BTREE_WRCSR.*
269b0 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f  * is set.  If FO
269c0 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20  RDELETE is set, 
269d0 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74  that is a hint t
269e0 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  o the implementa
269f0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69  tion that.** thi
26a00 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e  s cursor will on
26a10 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65  ly be used to se
26a20 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65  ek to and delete
26a30 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69   entries of an i
26a40 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20  ndex.** as part 
26a50 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45  of a larger DELE
26a60 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  TE statement.  T
26a70 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e  he FORDELETE hin
26a80 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
26a90 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  .** this impleme
26aa0 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e  ntation.  But in
26ab0 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20   a hypothetical 
26ac0 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72  alternative stor
26ad0 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69  age engine .** i
26ae0 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e  n which index en
26af0 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61  tries are automa
26b00 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
26b10 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69  when correspondi
26b20 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73  ng table.** rows
26b30 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68   are deleted, th
26b40 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67  e FORDELETE flag
26b50 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20   is a hint that 
26b60 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c  all SEEK and DEL
26b70 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ETE.** operation
26b80 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  s on this cursor
26b90 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61   can be no-ops a
26ba0 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72  nd all READ oper
26bb0 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72  ations can .** r
26bc0 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77  eturn a null row
26bd0 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20   (2-bytes: 0x01 
26be0 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  0x00)..**.** No 
26bf0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
26c00 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
26c10 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
26c20 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
26c30 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
26c40 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
26c50 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
26c60 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
26c70 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
26c80 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
26c90 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
26ca0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
26cb0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
26cc0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
26cd0 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
26ce0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
26cf0 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
26d00 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
26d10 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
26d20 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
26d30 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
26d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d60 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
26d70 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
26da0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
26db0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
26dc0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
26df0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
26e00 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
26e10 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
26e20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
26e30 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
26e40 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
26e50 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
26e80 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
26e90 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
26ea0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ec0 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
26ed0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43   handle */.  BtC
26ee0 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20  ursor *pX;      
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f      /* Looping o
26f10 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75  ver other all cu
26f20 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  rsors */..  asse
26f30 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
26f40 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
26f50 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
26f60 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  g==0 .       || 
26f70 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52  wrFlag==BTREE_WR
26f80 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  CSR .       || w
26f90 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52  rFlag==(BTREE_WR
26fa0 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c  CSR|BTREE_FORDEL
26fb0 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ETE) .  );..  /*
26fc0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
26fd0 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
26fe0 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
26ff0 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
27000 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
27010 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
27020 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
27030 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
27040 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
27050 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
27060 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
27070 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
27080 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
27090 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
270a0 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
270b0 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
270c0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
270d0 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
270e0 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f  nfo!=0, (wrFlag?
270f0 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72  2:1)) );.  asser
27100 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
27110 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
27120 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
27130 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
27140 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
27150 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
27160 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
27170 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
27180 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
27190 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
271a0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
271b0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
271c0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
271d0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
271e0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
271f0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
27200 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
27210 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
27220 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
27230 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46  =0 );..  if( wrF
27240 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
27250 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
27260 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
27270 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
27280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
27290 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
272a0 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
272b0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
272c0 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Bt)==0 ){.    as
272d0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
272e0 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20  );.    iTable = 
272f0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  0;.  }..  /* Now
27300 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
27310 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
27320 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
27330 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
27340 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
27350 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
27360 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
27370 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
27380 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
27390 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
273a0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
273b0 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
273c0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
273d0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
273e0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
273f0 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
27400 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
27410 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c  g ? BTCF_WriteFl
27420 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ag : 0;.  pCur->
27430 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20  curPagerFlags = 
27440 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47  wrFlag ? 0 : PAG
27450 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b  ER_GET_READONLY;
27460 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
27470 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  re two or more c
27480 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61  ursors on the sa
27490 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61  me btree, then a
274a0 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72  ll such.  ** cur
274b0 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65  sors *must* have
274c0 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
274d0 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a  le flag set. */.
274e0 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43    for(pX=pBt->pC
274f0 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58  ursor; pX; pX=pX
27500 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
27510 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  ( pX->pgnoRoot==
27520 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a  (Pgno)iTable ){.
27530 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61        pX->curFla
27540 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
27550 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ple;.      pCur-
27560 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
27570 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
27580 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e  }.  }.  pCur->pN
27590 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
275a0 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  or;.  pBt->pCurs
275b0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
275c0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
275d0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
275e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
275f0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
27600 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
27610 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
27620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27630 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
27640 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
27650 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
27660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27670 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
27680 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
27690 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
276a0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
276d0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
276e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
276f0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
27700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27710 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
27720 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
27730 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27760 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
27770 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
27780 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62  t rc;.  if( iTab
27790 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  le<1 ){.    rc =
277a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
277b0 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
277c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
277d0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
277e0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
277f0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
27800 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
27810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
27820 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
27830 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27840 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27850 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
27860 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
27870 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
27880 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
27890 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
278a0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
278b0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
278c0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
278d0 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
278e0 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
278f0 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
27900 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
27910 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
27920 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
27930 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
27940 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
27950 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
27960 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27970 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
27980 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
27990 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
279a0 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
279b0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
279c0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
279d0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
279e0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
279f0 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
27a00 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
27a10 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
27a20 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
27a30 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
27a40 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
27a50 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
27a60 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
27a70 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
27a80 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
27a90 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
27aa0 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
27ab0 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
27ac0 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
27ad0 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
27ae0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
27af0 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
27b00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
27b10 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
27b20 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
27b30 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
27b40 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
27b50 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
27b60 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
27b70 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
27b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27b90 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
27ba0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
27bb0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
27bc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27bd0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
27be0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
27bf0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
27c00 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
27c10 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
27c20 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
27c30 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
27c40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
27c50 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
27c60 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
27c70 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
27c80 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
27c90 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
27ca0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
27cb0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
27cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27cd0 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
27ce0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
27cf0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
27d00 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
27d10 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
27d20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
27d30 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
27d40 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
27d50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
27d60 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
27d70 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
27d80 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
27d90 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
27da0 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
27db0 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
27dc0 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  Cur);.    unlock
27dd0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
27de0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
27df0 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
27e00 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  flow);.    sqlit
27e10 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
27e20 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ey);.    sqlite3
27e30 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
27e40 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
27e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
27e60 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
27e70 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
27e80 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
27e90 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
27ea0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
27eb0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
27ec0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
27ed0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
27ee0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
27ef0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
27f00 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
27f10 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
27f20 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
27f30 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
27f40 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
27f50 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
27f60 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
27f70 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
27f80 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23  arseCell()..*/.#
27f90 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
27fa0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
27fb0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
27fc0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
27fd0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
27fe0 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
27ff0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
28000 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
28010 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
28020 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e  e, pCur->ix, &in
28030 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
28040 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d   CORRUPT_DB || m
28050 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
28060 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
28070 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
28080 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
28090 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
280a0 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
280b0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
280c0 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
280d0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
280e0 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
280f0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
28100 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
28110 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
28120 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
28130 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
28140 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26  pPage,pCur->ix,&
28150 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
28160 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
28170 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
28180 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
28190 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
281a0 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
281b0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
281c0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
281d0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
281e0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
281f0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
28200 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
28210 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
28220 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
28230 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
28240 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
28250 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
28260 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
28270 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
28280 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
28290 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
282a0 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
282b0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
282c0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
282d0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
282e0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
282f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28300 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
28310 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
28320 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
28330 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
28340 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
28350 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
28360 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
28370 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
28380 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
28390 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
283a0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
283b0 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
283c0 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
283d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
283e0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
283f0 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
28400 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
28410 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
28420 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
28430 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
28440 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
28450 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
28460 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
28470 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
28480 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
28490 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
284a0 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
284b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
284c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
284d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
284e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
284f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28500 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28510 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
28520 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
28530 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
28540 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
28550 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .nKey;.}../*.** 
28560 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
28570 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
28580 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
28590 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
285a0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
285b0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
285c0 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
285d0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
285e0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
285f0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
28600 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
28610 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
28620 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
28630 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
28640 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
28650 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
28660 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
28670 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
28680 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
28690 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
286a0 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
286b0 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
286c0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
286d0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
286e0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
286f0 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
28700 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
28710 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
28720 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28730 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28740 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28750 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28760 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
28770 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
28780 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
28790 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
287a0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
287b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
287c0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
287d0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
287e0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
287f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
28800 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
28810 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
28820 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
28830 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
28840 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
28850 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
28860 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
28870 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
28880 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
28890 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
288a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
288b0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
288c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
288d0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
288e0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
288f0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
28900 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
28910 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
28920 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
28930 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
28940 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
28950 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
28960 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
28970 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
28980 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
28990 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
289a0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
289b0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
289c0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
289d0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
289e0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
289f0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
28a00 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
28a10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
28a20 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
28a30 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
28a40 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
28a50 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
28a60 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
28a70 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
28a80 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
28a90 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
28aa0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
28ab0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
28ac0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
28ad0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
28ae0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
28af0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
28b00 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
28b10 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
28b20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
28b30 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
28b40 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
28b50 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
28b60 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
28b70 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
28b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28b90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28ba0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
28bd0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
28be0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
28bf0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
28c00 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
28c10 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
28c20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
28c30 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
28c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28c50 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
28c60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
28c70 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
28c80 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
28c90 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
28ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28cb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28cc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
28cd0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
28ce0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
28cf0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
28d00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28d10 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
28d20 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
28d30 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
28d40 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
28d50 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
28d60 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
28d70 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
28d80 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
28d90 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
28da0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
28db0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
28dc0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
28dd0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
28de0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
28df0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
28e00 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
28e10 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
28e20 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
28e30 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
28e40 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
28e50 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28e60 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
28e70 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
28e80 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
28e90 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
28ea0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
28eb0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
28ec0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
28ed0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
28ee0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
28ef0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
28f00 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
28f10 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
28f20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
28f30 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
28f40 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
28f50 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
28f60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28f70 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
28f80 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
28f90 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
28fa0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
28fb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
28fc0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
28fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
28fe0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
28ff0 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
29000 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
29010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29020 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
29030 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29040 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
29050 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
29060 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
29070 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
29080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
29090 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
290a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
290b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
290c0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
290d0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
290e0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
290f0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
29100 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
29110 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
29120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
29130 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
29140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
29150 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
29160 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
29170 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
29180 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
29190 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
291a0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
291b0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
291c0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
291d0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
291e0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
291f0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
29200 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
29210 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
29220 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
29230 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
29240 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
29250 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
29260 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
29270 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
29280 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
29290 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
292a0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
292b0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
292c0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
292d0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
292e0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
292f0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
29300 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
29310 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
29320 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
29330 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
29340 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
29350 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
29360 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
29370 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
29380 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
29390 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
293a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
293b0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
293c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
293d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
293f0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
29400 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
29410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
29420 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
29430 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
29440 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
29450 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
29460 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
29470 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
29480 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
29490 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
294a0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
294b0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
294c0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
294d0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
294e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
294f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
29500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29510 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29520 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
29530 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
29540 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
29550 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
29560 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
29570 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
29580 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
29590 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
295a0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
295b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
295c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
295d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
295e0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
295f0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
29600 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
29610 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
29620 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
29630 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
29640 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
29650 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
29660 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
29670 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
29680 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
29690 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
296a0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
296b0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
296c0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
296d0 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
296e0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
296f0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
29700 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
29710 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
29720 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
29730 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
29740 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
29750 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
29760 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
29770 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
29780 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
29790 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
297a0 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
297b0 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
297c0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
297d0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
297e0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
297f0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
29800 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
29810 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
29820 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ages.** this fun
29830 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
29840 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
29850 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
29860 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  .** the overflow
29870 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
29880 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
29890 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
298a0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
298b0 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
298c0 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
298d0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
298e0 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
298f0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
29900 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
29910 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
29920 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
29930 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62  cated, it must b
29940 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
29950 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
29960 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
29970 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
29980 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
29990 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
299a0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
299b0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
299c0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
299d0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
299e0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
299f0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
29a00 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
29a10 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
29a20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
29a30 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
29a40 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
29a50 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
29a60 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
29a70 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
29a80 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
29a90 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
29aa0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
29ab0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
29ac0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
29ad0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
29ae0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
29af0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
29b00 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
29b10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
29b20 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
29b30 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
29b40 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
29b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29b60 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
29b70 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
29b80 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
29b90 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
29ba0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
29bb0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29bd0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
29be0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
29bf0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
29c00 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
29c10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29c20 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
29c30 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
29c40 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
29c50 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >pPage;         
29c60 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70        /* Btree p
29c70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
29c80 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
29c90 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
29ca0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
29cb0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
29cc0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
29cd0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
29ce0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
29cf0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
29d00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
29d10 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
29d20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61  pBuf;     /* Sta
29d30 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f  rt of original o
29d40 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e  ut buffer */.#en
29d50 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
29d60 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
29d70 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d  ( eOp==0 || eOp=
29d80 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
29d90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29da0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29db0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
29dc0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
29dd0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29de0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
29df0 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
29e00 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
29e10 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
29e20 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61  fo.pPayload;.  a
29e30 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
29e40 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
29e50 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61  nPayload );..  a
29e60 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20  ssert( aPayload 
29e70 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  > pPage->aData )
29e80 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61  ;.  if( (uptr)(a
29e90 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d  Payload - pPage-
29ea0 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e  >aData) > (pBt->
29eb0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75  usableSize - pCu
29ec0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20  r->info.nLocal) 
29ed0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
29ee0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
29ef0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
29f00 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
29f10 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20   error.  The.   
29f20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   ** conditional 
29f30 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a  above is really:
29f40 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79  .    **    &aPay
29f50 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
29f60 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
29f70 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
29f80 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20  bleSize].    ** 
29f90 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e  but is recast in
29fa0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66  to its current f
29fb0 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74  orm to avoid int
29fc0 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72  eger overflow pr
29fd0 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20  oblems.    */.  
29fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29ff0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
2a000 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  ge->pgno);.  }..
2a010 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
2a020 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
2a030 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
2a040 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
2a050 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
2a060 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
2a070 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
2a080 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
2a090 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
2a0a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
2a0b0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
2a0c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
2a0d0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
2a0e0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
2a0f0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
2a100 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
2a110 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
2a120 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
2a130 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
2a140 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
2a150 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
2a160 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
2a170 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
2a180 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
2a190 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
2a1a0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
2a1b0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
2a1c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
2a1d0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
2a1e0 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
2a1f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
2a200 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
2a210 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2a220 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
2a230 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
2a240 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
2a250 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
2a260 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
2a270 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
2a280 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
2a290 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
2a2a0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
2a2b0 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
2a2c0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
2a2d0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
2a2e0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
2a2f0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
2a300 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2a310 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
2a320 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
2a330 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
2a340 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
2a350 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
2a360 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
2a370 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
2a380 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
2a390 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
2a3a0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
2a3b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2a3c0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2a3d0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2a3e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2a3f0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
2a400 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
2a410 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2a420 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
2a430 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
2a440 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
2a450 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
2a460 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
2a470 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
2a480 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
2a490 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
2a4a0 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
2a4b0 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
2a4c0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2a4d0 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
2a4e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2a4f0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2a500 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a510 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
2a520 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
2a530 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
2a540 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
2a550 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
2a560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
2a570 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
2a580 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
2a590 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
2a5a0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2a5b0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
2a5c0 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ovfl;.    }else{
2a5d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2a5e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
2a5f0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
2a600 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
2a610 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e   the.      ** en
2a620 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
2a630 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
2a640 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
2a650 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a  d, skip.      **
2a660 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
2a670 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2a680 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
2a690 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
2a6a0 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  ize] ){.        
2a6b0 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
2a6c0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
2a6d0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
2a6e0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
2a6f0 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  x];.        offs
2a700 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
2a710 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  lSize);.      }.
2a720 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
2a730 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2a740 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20   && amt>0 );.   
2a750 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65   while( nextPage
2a760 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2a770 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
2a780 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
2a790 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
2a7a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2a7b0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
2a7c0 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20  w[iIdx]==0.     
2a7d0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72           || pCur
2a7e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
2a7f0 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20  ]==nextPage.    
2a800 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52            || COR
2a810 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20  RUPT_DB );.     
2a820 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2a830 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
2a840 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  e;..      if( of
2a850 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
2a860 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2a870 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
2a880 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
2a890 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
2a8a0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2a8b0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
2a8c0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
2a8d0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
2a8e0 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
2a8f0 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
2a900 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
2a910 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
2a920 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
2a930 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
2a940 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
2a950 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
2a960 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
2a970 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
2a980 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
2a990 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a9a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a9b0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2a9c0 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
2a9d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a9e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
2a9f0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
2aa00 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
2aa10 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
2aa20 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
2aa30 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
2aa40 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
2aa50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2aa60 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
2aa70 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
2aa80 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
2aa90 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
2aaa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
2aab0 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
2aac0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2aad0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
2aae0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
2aaf0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
2ab00 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
2ab10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
2ab20 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
2ab30 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
2ab40 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
2ab50 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
2ab60 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
2ab70 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
2ab80 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
2ab90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2aba0 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  fd;      /* File
2abb0 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
2abc0 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f  o direct overflo
2abd0 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  w read */.#endif
2abe0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
2abf0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
2ac00 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
2ac10 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
2ac20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
2ac30 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
2ac40 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
2ac50 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
2ac60 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
2ac70 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
2ac80 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2ac90 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
2aca0 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
2acb0 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
2acc0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
2acd0 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
2ace0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
2acf0 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
2ad00 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
2ad10 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
2ad20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69   **   3) there i
2ad30 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
2ad40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
2ad50 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
2ad60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2ad70 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
2ad80 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
2ad90 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  ) the page is no
2ada0 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  t in the WAL fil
2adb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  e.        **   6
2adc0 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
2add0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
2ade0 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
2adf0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2ae00 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
2ae10 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
2ae20 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
2ae30 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
2ae40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
2ae50 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
2ae60 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
2ae70 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
2ae80 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
2ae90 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
2aea0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
2aeb0 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
2aec0 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
2aed0 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
2aee0 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
2aef0 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
2af00 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af30 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
2af40 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af70 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
2af80 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
2af90 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2afa0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
2afd0 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
2afe0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
2aff0 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
2b000 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29  thods     /* (4)
2b010 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
2b020 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55  0==sqlite3PagerU
2b030 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  seWal(pBt->pPage
2b040 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20  r, nextPage)    
2b050 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
2b060 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
2b070 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2b0a0 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  6) */.        ){
2b0b0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
2b0c0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
2b0d0 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
2b0e0 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
2b0f0 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
2b100 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b120 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20           /* due 
2b130 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  to (6) */.      
2b140 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
2b150 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
2b160 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b170 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
2b180 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
2b190 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
2b1a0 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
2b1b0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
2b1c0 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
2b1d0 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
2b1e0 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
2b1f0 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
2b200 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2b210 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2b220 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
2b230 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
2b240 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2b250 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
2b260 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
2b270 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
2b280 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45    (eOp==0 ? PAGE
2b290 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
2b2a0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
2b2b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b2c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
2b2e0 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
2b2f0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
2b300 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2b310 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
2b320 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
2b330 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2b340 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
2b350 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
2b360 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
2b370 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b380 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2b390 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
2b3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
2b3b0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
2b3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b3d0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
2b3e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d  ;.        if( am
2b3f0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  t==0 ) return rc
2b400 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
2b410 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
2b420 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2b430 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b  k;.      iIdx++;
2b440 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2b450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b460 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
2b470 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69  /* Overflow chai
2b480 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65  n ends premature
2b490 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
2b4a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b4b0 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
2b4c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b4d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
2b4e0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
2b4f0 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
2b500 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
2b510 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
2b520 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
2b530 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
2b540 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
2b550 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
2b560 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
2b570 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
2b580 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
2b590 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
2b5a0 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
2b5b0 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
2b5c0 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
2b5d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
2b5e0 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
2b5f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
2b600 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
2b610 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
2b620 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
2b630 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
2b640 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
2b650 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
2b660 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
2b670 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
2b680 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
2b690 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
2b6a0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
2b6b0 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
2b6c0 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
2b6d0 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
2b6e0 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
2b6f0 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
2b700 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
2b710 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
2b720 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
2b730 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
2b740 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
2b750 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
2b760 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
2b770 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
2b780 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
2b790 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
2b7a0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
2b7b0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
2b7c0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
2b7d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2b7e0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
2b7f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2b800 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
2b810 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
2b820 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b830 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2b840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b850 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b860 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2b870 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2b880 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  e>=0 && pCur->pP
2b890 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
2b8a0 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2b8b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2b8c0 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
2b8d0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
2b8e0 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
2b8f0 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
2b900 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
2b910 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c  s variant of sql
2b920 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2b930 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66  () works even if
2b940 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
2b950 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55  not.** in the CU
2b960 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65  RSOR_VALID state
2b970 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  .  It is only us
2b980 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
2b990 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a  3_blob_read().**
2b9a0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
2b9b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b9c0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74  IT_INCRBLOB.stat
2b9d0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2b9e0 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  NE int accessPay
2b9f0 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42  loadChecked(.  B
2ba00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20  tCursor *pCur,. 
2ba10 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75   u32 offset,.  u
2ba20 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a  32 amt,.  void *
2ba30 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pBuf.){.  int rc
2ba40 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  ;.  if ( pCur->e
2ba50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2ba60 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
2ba70 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
2ba80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ba90 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2baa0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ed(pCur) );.  rc
2bab0 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43   = btreeRestoreC
2bac0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2bad0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
2bae0 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61   ? rc : accessPa
2baf0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
2bb00 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
2bb10 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
2bb20 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
2bb30 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ked(BtCursor *pC
2bb40 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
2bb50 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
2bb60 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Buf){.  if( pCur
2bb70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2bb80 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2bb90 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2bba0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2bbb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  ;.    return acc
2bbc0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2bbd0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
2bbe0 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  uf, 0);.  }else{
2bbf0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
2bc00 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  ssPayloadChecked
2bc10 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
2bc20 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d  mt, pBuf);.  }.}
2bc30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2bc40 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20  E_OMIT_INCRBLOB 
2bc50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
2bc60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
2bc70 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
2bc80 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
2bc90 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
2bca0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
2bcb0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
2bcc0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
2bcd0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
2bce0 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
2bcf0 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
2bd00 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
2bd10 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
2bd20 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
2bd30 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
2bd40 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
2bd50 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
2bd60 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
2bd70 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2bd80 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
2bd90 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
2bda0 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
2bdb0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
2bdc0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
2bdd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2bde0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2bdf0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
2be00 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
2be10 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
2be20 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
2be30 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
2be40 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
2be50 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
2be60 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
2be70 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
2be80 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
2be90 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
2bea0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
2beb0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
2bec0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
2bed0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
2bee0 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
2bef0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
2bf00 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2bf10 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
2bf20 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
2bf30 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
2bf40 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
2bf50 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
2bf60 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
2bf70 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
2bf80 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
2bf90 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
2bfa0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
2bfb0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
2bfc0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
2bfd0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
2bfe0 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
2bff0 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
2c000 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2c010 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
2c020 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
2c030 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
2c040 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
2c050 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
2c060 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
2c070 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
2c080 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
2c090 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
2c0a0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
2c0b0 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
2c0c0 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20  .){.  int amt;. 
2c0d0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
2c0e0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
2c0f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  =0 && pCur->pPag
2c100 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e);.  assert( pC
2c110 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2c120 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2c130 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2c140 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2c150 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2c160 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
2c170 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2c180 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2c190 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
2c1a0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c1b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c1c0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
2c1d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c1e0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2c1f0 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  d>pCur->pPage->a
2c200 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
2c210 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
2c220 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2c230 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  oad<pCur->pPage-
2c240 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52  >aDataEnd ||CORR
2c250 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d  UPT_DB);.  amt =
2c260 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2c270 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69  al;.  if( amt>(i
2c280 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  nt)(pCur->pPage-
2c290 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
2c2a0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
2c2b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2c2c0 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73   is too little s
2c2d0 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
2c2e0 20 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65   for the expecte
2c2f0 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20  d amount.    ** 
2c300 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74  of local content
2c310 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20  . Database must 
2c320 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2c330 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
2c340 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74  PT_DB );.    amt
2c350 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28   = MAX(0, (int)(
2c360 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
2c370 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
2c380 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20  fo.pPayload));. 
2c390 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33   }.  *pAmt = (u3
2c3a0 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  2)amt;.  return 
2c3b0 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
2c3c0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
2c3d0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
2c3e0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
2c3f0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
2c400 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
2c410 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
2c420 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
2c430 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
2c440 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
2c450 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
2c460 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2c470 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2c480 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
2c490 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
2c4a0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
2c4b0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
2c4c0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
2c4d0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
2c4e0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
2c4f0 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
2c500 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
2c510 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
2c520 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
2c530 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
2c540 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
2c550 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
2c560 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
2c570 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
2c580 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
2c590 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
2c5a0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
2c5b0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
2c5c0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
2c5d0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
2c5e0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
2c5f0 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
2c600 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
2c610 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
2c620 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2c630 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  adFetch(BtCursor
2c640 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
2c650 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
2c660 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
2c670 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
2c680 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2c690 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
2c6a0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2c6b0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
2c6c0 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
2c6d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
2c6e0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
2c6f0 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
2c700 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2c710 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2c720 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
2c730 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
2c740 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
2c750 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
2c760 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
2c770 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
2c780 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
2c790 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
2c7a0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
2c7b0 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
2c7c0 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
2c7d0 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
2c7e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c7f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
2c800 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2c810 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
2c820 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2c830 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
2c840 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2c850 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2c860 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2c870 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2c880 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2c890 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c8a0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
2c8b0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
2c8c0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2c8d0 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
2c8e0 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
2c8f0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
2c900 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2c910 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2c920 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  KPT;.  }.  pCur-
2c930 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c940 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2c950 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2c960 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2c970 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61  Ovfl);.  pCur->a
2c980 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c990 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20  ] = pCur->ix;.  
2c9a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2c9b0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72  r->iPage] = pCur
2c9c0 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2c9d0 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  >ix = 0;.  pCur-
2c9e0 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 63 20 3d  >iPage++;.  rc =
2c9f0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2ca00 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
2ca10 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20  Cur->pPage,.    
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca30 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e      pCur, pCur->
2ca40 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2ca50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ca60 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 65 74 4d 65  _OK ){.    setMe
2ca70 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e  mpageRoot(pCur->
2ca80 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e  pPage, pCur->pgn
2ca90 6f 52 6f 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65  oRoot);.  }.  re
2caa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
2cab0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2cac0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
2cad0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
2cae0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
2caf0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
2cb00 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
2cb10 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
2cb20 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
2cb30 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
2cb40 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
2cb50 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
2cb60 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
2cb70 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
2cb80 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
2cb90 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
2cba0 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
2cbb0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2cbc0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2cbd0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
2cbe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2cbf0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2cc00 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2cc10 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
2cc20 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
2cc30 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
2cc40 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
2cc50 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
2cc60 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
2cc70 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc90 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
2cca0 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
2ccb0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
2ccc0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2ccd0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
2cce0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2ccf0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2cd00 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2cd10 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2cd20 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
2cd30 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
2cd40 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2cd50 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2cd60 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
2cd70 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
2cd80 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
2cd90 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2cda0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
2cdb0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2cdc0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
2cdd0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
2cde0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
2cdf0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
2ce00 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
2ce10 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2ce20 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2ce30 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2ce40 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
2ce50 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
2ce60 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
2ce70 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
2ce80 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2ce90 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
2cea0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
2ceb0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
2cec0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
2ced0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
2cee0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2cef0 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72   *pLeaf;.  asser
2cf00 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2cf10 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2cf20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2cf30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2cf40 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2cf50 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
2cf60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2cf70 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2cf80 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
2cf90 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2cfa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2cfb0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
2cfc0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2cfd0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  , .    pCur->pPa
2cfe0 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  ge->pgno.  );.  
2cff0 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
2d000 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d010 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
2d020 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2d030 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
2d040 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2d050 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2d060 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2d070 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2d080 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2d090 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69  r->ix = pCur->ai
2d0a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2d0b0 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43  1];.  pLeaf = pC
2d0c0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75  ur->pPage;.  pCu
2d0d0 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2d0e0 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e  >apPage[--pCur->
2d0f0 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73  iPage];.  releas
2d100 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65  ePageNotNull(pLe
2d110 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  af);.}../*.** Mo
2d120 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2d130 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2d140 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2d150 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2d160 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2d170 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2d180 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2d190 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2d1a0 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2d1b0 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2d1c0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2d1d0 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2d1e0 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2d1f0 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2d200 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2d210 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2d220 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2d230 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2d240 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2d250 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2d260 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2d270 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2d280 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2d290 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2d2a0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2d2b0 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2d2c0 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2d2d0 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2d2e0 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75  LID and this rou
2d2f0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2d300 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72  ITE_EMPTY. Other
2d310 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72  wise,.** the cur
2d320 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
2d330 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
2d340 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
2d350 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72   the root.** (or
2d360 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
2d370 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
2d380 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2d390 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
2d3a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
2d3b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2d3c0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
2d3d0 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
2d3e0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
2d3f0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
2d400 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2d410 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
2d420 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
2d430 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
2d440 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
2d450 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
2d460 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
2d470 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
2d480 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
2d490 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2d4a0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2d4b0 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
2d4c0 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
2d4d0 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
2d4e0 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
2d4f0 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
2d500 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
2d510 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2d520 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2d530 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
2d540 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
2d550 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
2d560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2d570 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
2d580 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2d590 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
2d5a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d5b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d5c0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2d5d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d5e0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
2d5f0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
2d600 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2d610 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2d620 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
2d630 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2d640 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
2d650 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
2d660 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2d670 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2d680 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  te < CURSOR_REQU
2d690 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d  IRESEEK || pCur-
2d6a0 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73  >iPage<0 );.  as
2d6b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2d6c0 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Root>0 || pCur->
2d6d0 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
2d6e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2d6f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2d700 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2d710 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2d720 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29  ull(pCur->pPage)
2d730 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d  ;.      while( -
2d740 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a  -pCur->iPage ){.
2d750 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2d760 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2d770 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d780 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  age]);.      }. 
2d790 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65       pCur->pPage
2d7a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d7b0 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  0];.      goto s
2d7c0 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
2d7d0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
2d7e0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
2d7f0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2d800 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2d810 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
2d820 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2d830 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2d840 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
2d850 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
2d860 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
2d870 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2d880 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2d890 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d8a0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
2d8b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2d8c0 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
2d8d0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2d8e0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2d8f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2d900 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2d910 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
2d920 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  r);.    }.    rc
2d930 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2d940 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
2d950 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2d960 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
2d970 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2d980 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
2d990 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2d9a0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
2d9b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d9c0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2d9d0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2d9e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2d9f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  c;.    }.    set
2da00 4d 65 6d 70 61 67 65 52 6f 6f 74 28 70 43 75 72  MempageRoot(pCur
2da10 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 70  ->pPage, pCur->p
2da20 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43  gnoRoot);.    pC
2da30 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
2da40 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
2da50 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ey = pCur->pPage
2da60 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20  ->intKey;.  }.  
2da70 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
2da80 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
2da90 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
2daa0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
2dab0 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
2dac0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
2dad0 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
2dae0 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
2daf0 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
2db00 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
2db10 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
2db20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
2db30 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
2db40 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
2db50 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
2db60 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
2db70 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2db80 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
2db90 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
2dba0 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
2dbb0 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
2dbc0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2dbd0 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
2dbe0 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
2dbf0 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
2dc00 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2dc10 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
2dc20 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
2dc30 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2dc40 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
2dc50 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
2dc60 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
2dc70 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
2dc80 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
2dc90 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
2dca0 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
2dcb0 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
2dcc0 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
2dcd0 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
2dce0 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
2dcf0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2dd00 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
2dd10 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
2dd20 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
2dd30 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
2dd40 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
2dd50 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
2dd60 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
2dd70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2dd80 54 5f 50 47 4e 4f 28 70 43 75 72 2d 3e 70 50 61  T_PGNO(pCur->pPa
2dd90 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  ge->pgno);.  }..
2dda0 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70  skip_init:  .  p
2ddb0 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70  Cur->ix = 0;.  p
2ddc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2ddd0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2dde0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2ddf0 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2de00 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2de10 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20  Ovfl);..  pRoot 
2de20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2de30 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
2de40 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
2de50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2de60 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
2de70 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
2de80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
2de90 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
2dea0 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
2deb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2dec0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
2ded0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
2dee0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
2def0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
2df00 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2df10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2df20 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
2df30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2df40 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
2df50 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
2df60 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2df70 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  NVALID;.    rc =
2df80 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
2df90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2dfa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2dfb0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
2dfc0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
2dfd0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
2dfe0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
2dff0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
2e000 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2e010 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
2e020 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
2e030 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
2e040 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
2e050 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
2e060 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
2e070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2e080 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
2e090 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
2e0a0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
2e0b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e0c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e0d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2e0e0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2e0f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2e100 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2e110 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2e120 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
2e130 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
2e140 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2e150 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
2e160 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2e170 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2e180 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2e190 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2e1a0 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a  ge, pCur->ix));.
2e1b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2e1c0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
2e1d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2e1e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2e1f0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2e200 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
2e210 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
2e220 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
2e230 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
2e240 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2e250 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
2e260 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
2e270 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
2e280 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
2e290 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
2e2a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2e2b0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
2e2c0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
2e2d0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
2e2e0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
2e2f0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
2e300 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
2e310 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
2e320 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
2e330 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
2e340 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
2e350 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
2e360 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
2e370 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
2e380 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
2e390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2e3a0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
2e3b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2e3c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2e3d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e3e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2e3f0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
2e400 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2e410 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2e420 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2e430 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2e440 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
2e450 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
2e460 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
2e470 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2e480 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2e490 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2e4a0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2e4b0 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2e4c0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
2e4d0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2e4e0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
2e4f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e500 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70  }.  pCur->ix = p
2e510 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2e520 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2e530 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2e540 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2e550 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2e560 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
2e570 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e580 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
2e590 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2e5a0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2e5b0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
2e5c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
2e5d0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
2e5e0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
2e5f0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
2e600 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
2e610 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
2e620 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
2e630 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2e640 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2e650 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
2e660 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2e670 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2e680 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
2e690 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2e6a0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2e6b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e6c0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2e6d0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2e6e0 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
2e6f0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2e700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e710 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e720 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2e730 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  ll>0 );.    *pRe
2e740 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
2e750 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2e760 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Cur);.  }else if
2e770 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2e780 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2e790 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2e7a0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2e7b0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2e7c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2e7d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e7e0 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2e7f0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2e800 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2e810 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2e820 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2e830 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
2e840 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
2e850 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
2e860 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
2e870 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
2e880 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
2e890 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
2e8a0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2e8b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e8c0 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
2e8d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2e8e0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2e8f0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
2e900 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2e910 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e920 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2e930 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2e940 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2e950 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2e960 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
2e970 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
2e980 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
2e990 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
2e9a0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2e9b0 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
2e9c0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e9d0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2e9e0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2e9f0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
2ea00 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
2ea10 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
2ea20 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
2ea30 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
2ea40 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
2ea50 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2ea60 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
2ea70 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
2ea80 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
2ea90 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
2eaa0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2eab0 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
2eac0 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
2ead0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
2eae0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2eaf0 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ==pCur->pPage->n
2eb00 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2eb10 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2eb20 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  e->leaf );.#endi
2eb30 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
2eb40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
2eb50 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2eb60 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2eb70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2eb80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2eb90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2eba0 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  LID );.    *pRes
2ebb0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
2ebc0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2ebd0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2ebe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ebf0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2ec00 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
2ec10 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  st;.    }else{. 
2ec20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2ec30 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c  ags &= ~BTCF_AtL
2ec40 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ast;.    }.  }el
2ec50 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2ec60 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61  E_EMPTY ){.    a
2ec70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2ec80 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2ec90 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
2eca0 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
2ecb0 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
2ecc0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
2ecd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
2ece0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
2ecf0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
2ed00 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
2ed10 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
2ed20 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
2ed30 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
2ed40 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
2ed50 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
2ed60 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
2ed70 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
2ed80 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
2ed90 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
2eda0 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
2edb0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
2edc0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
2edd0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
2ede0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
2edf0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
2ee00 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
2ee10 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2ee20 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
2ee30 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
2ee40 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
2ee50 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
2ee60 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
2ee70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
2ee80 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
2ee90 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
2eea0 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
2eeb0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
2eec0 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
2eed0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
2eee0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
2eef0 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
2ef00 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
2ef10 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
2ef20 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
2ef30 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
2ef40 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
2ef50 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
2ef60 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
2ef70 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
2ef80 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2ef90 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
2efa0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2efb0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2efc0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2efd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2efe0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
2eff0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2f000 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
2f010 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
2f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2f030 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
2f040 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
2f050 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
2f060 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
2f070 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
2f080 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
2f090 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2f0a0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
2f0b0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
2f0c0 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
2f0d0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2f0e0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
2f0f0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
2f100 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2f110 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
2f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f130 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
2f140 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
2f150 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78  .**.** For index
2f160 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64   tables, the pId
2f170 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65  xKey->eqSeen fie
2f180 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20 69  ld is set to 1 i
2f190 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74  f there.** exist
2f1a0 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  s an entry in th
2f1b0 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61  e table that exa
2f1c0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64  ctly matches pId
2f1d0 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  xKey.  .*/.int s
2f1e0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
2f1f0 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
2f200 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2f210 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
2f220 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
2f230 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
2f240 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
2f250 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
2f260 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
2f270 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
2f280 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
2f290 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
2f2a0 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
2f2b0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
2f2c0 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
2f2d0 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
2f2e0 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
2f2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2f300 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
2f310 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
2f320 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64  int rc;.  Record
2f330 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43  Compare xRecordC
2f340 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72  ompare;..  asser
2f350 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2f360 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2f370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f380 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2f390 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2f3a0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2f3b0 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
2f3c0 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
2f3d0 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
2f3e0 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  o==0) );.  asser
2f3f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  t( pCur->eState!
2f400 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2f410 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
2f420 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21  pCur->curIntKey!
2f430 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
2f440 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2f450 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
2f460 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
2f470 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
2f480 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
2f490 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
2f4a0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
2f4b0 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49  work */.  if( pI
2f4c0 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70  dxKey==0.   && p
2f4d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2f4e0 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43  SOR_VALID && (pC
2f4f0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2f500 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d  TCF_ValidNKey)!=
2f510 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0.  ){.    if( p
2f520 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2f530 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2f540 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2f550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f560 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2f570 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2f580 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2f590 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
2f5a0 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2f5b0 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  st)!=0 ){.      
2f5c0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2f5d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f5e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2f5f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2f600 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69 73  requested key is
2f610 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
2f620 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c  he previous key,
2f630 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   then.      ** t
2f640 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65 20  ry to get there 
2f650 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72  using sqlite3Btr
2f660 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72 20  eeNext() rather 
2f670 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20  than a full.    
2f680 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72    ** binary sear
2f690 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  ch.  This is an 
2f6a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
2f6b0 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74 20  y.  The correct 
2f6c0 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20  answer.      ** 
2f6d0 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65  is still obtaine
2f6e0 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 63  d without this c
2f6f0 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74  ase, only a litt
2f700 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20  le more slowely 
2f710 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
2f720 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d  r->info.nKey+1==
2f730 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d  intKey && !pCur-
2f740 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2f750 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2f760 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f770 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2f780 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
2f790 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f7a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
2f7b0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
2f7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f7d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2f7e0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2f7f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f800 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2f810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2f820 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2f830 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
2f840 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f850 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
2f860 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e{.          ret
2f870 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2f880 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2f890 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b    }..  if( pIdxK
2f8a0 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72  ey ){.    xRecor
2f8b0 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  dCompare = sqlit
2f8c0 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
2f8d0 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  e(pIdxKey);.    
2f8e0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2f8f0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2f900 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  ( pIdxKey->defau
2f910 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20  lt_rc==1 .      
2f920 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2f930 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20  efault_rc==0 .  
2f940 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2f950 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d  y->default_rc==-
2f960 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  1.    );.  }else
2f970 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2f980 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c  pare = 0; /* All
2f990 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65   keys are intege
2f9a0 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20  rs */.  }..  rc 
2f9b0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2f9c0 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
2f9d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f9e0 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2f9f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fa00 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2fa10 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2fa20 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2fa30 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2fa40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fa50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2fa60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2fa70 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2fa80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2fa90 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
2faa0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2fab0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2fac0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2fad0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2fae0 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b  ge->nCell > 0 );
2faf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2fb00 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75  >iPage==0 || pCu
2fb10 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
2fb20 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49  tKey==pCur->curI
2fb30 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  ntKey );.  asser
2fb40 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
2fb50 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
2fb60 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
2fb70 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
2fb80 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
2fb90 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
2fba0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2fbb0 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20  ->pPage;.    u8 
2fbc0 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbe0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2fbf0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
2fc00 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
2fc10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
2fc20 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
2fc30 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
2fc40 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
2fc50 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
2fc60 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
2fc70 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
2fc80 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
2fc90 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
2fca0 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
2fcb0 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
2fcc0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
2fcd0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
2fce0 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
2fcf0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
2fd00 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
2fd10 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
2fd20 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
2fd30 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
2fd40 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
2fd50 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
2fd60 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
2fd70 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
2fd80 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
2fd90 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
2fda0 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
2fdb0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
2fdc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fdd0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
2fde0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2fdf0 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
2fe00 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
2fe10 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
2fe20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2fe30 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
2fe40 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
2fe50 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
2fe60 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
2fe70 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
2fe80 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
2fe90 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
2fea0 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69  ; */.    pCur->i
2feb0 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2fec0 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
2fed0 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
2fee0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2fef0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
2ff00 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2ff10 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2ff20 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
2ff30 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2ff40 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
2ff50 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
2ff60 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
2ff70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2ff80 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
2ff90 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20  e->aDataEnd ){. 
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2ffb0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2ffc0 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
2ffd0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2ffe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2fff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30000 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
30010 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
30020 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
30030 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
30040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
30050 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
30060 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
30070 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
30080 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
30090 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
300a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
300b0 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
300c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
300d0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
300e0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
300f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30100 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
30110 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
30120 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
30130 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
30140 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
30150 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
30160 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
30170 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx;.            
30180 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74  goto moveto_next
30190 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20  _layer;.        
301a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
301b0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
301c0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
301d0 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
301e0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
301f0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
30200 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
30210 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
30220 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
30230 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
30240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30250 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
30260 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
30270 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
30280 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
30290 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
302a0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
302b0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
302c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
302d0 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
302e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
302f0 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ell;  /* Size of
30300 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20   the pCell cell 
30310 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
30320 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
30330 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
30340 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  e, idx);..      
30350 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
30360 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
30370 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
30380 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
30390 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
303a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
303b0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
303c0 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
303d0 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
303e0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
303f0 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
30400 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
30410 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
30420 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
30430 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
30440 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
30450 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
30460 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
30470 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
30480 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
30490 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
304a0 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
304b0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
304c0 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
304d0 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
304e0 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
304f0 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
30500 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
30510 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
30520 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30530 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
30540 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
30550 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
30560 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
30570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
30580 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
30590 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
305a0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
305b0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
305c0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
305d0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
305e0 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
305f0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
30600 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
30610 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
30620 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
30630 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
30640 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
30650 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
30660 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
30670 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
30680 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
30690 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
306a0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
306b0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
306c0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
306d0 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
306e0 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
306f0 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
30700 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
30710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30720 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
30730 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
30740 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
30750 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
30760 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
30770 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
30780 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
30790 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
307a0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
307b0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
307c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
307d0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
307e0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
307f0 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
30800 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
30810 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
30820 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
30830 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
30840 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
30850 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
30860 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
30870 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
30880 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
30890 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
308a0 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
308b0 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
308c0 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
308d0 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
308e0 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
308f0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
30900 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
30910 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
30920 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
30930 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
30940 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
30950 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
30960 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
30970 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
30980 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
30990 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
309a0 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
309b0 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
309c0 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
309d0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
309e0 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
309f0 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
30a00 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
30a10 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
30a20 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
30a30 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
30a40 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
30a50 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
30a60 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
30a70 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
30a80 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
30a90 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
30aa0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
30ab0 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
30ac0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
30ad0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
30ae0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
30af0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
30b00 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
30b10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
30b20 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
30b30 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
30b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
30b50 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
30b60 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
30b70 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
30b80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
30b90 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
30ba0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
30bb0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
30bc0 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
30bd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30be0 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
30bf0 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
30c00 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
30c10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
30c20 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
30c30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30c40 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
30c50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
30c60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
30c70 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
30c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30c90 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
30ca0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
30cb0 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
30cc0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
30cd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
30ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
30cf0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
30d00 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
30d10 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
30d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
30d30 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
30d40 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
30d50 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
30d60 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
30d70 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
30d80 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
30d90 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
30da0 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
30db0 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
30dc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
30dd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30de0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
30df0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
30e00 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
30e10 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
30e20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
30e30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
30e40 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
30e50 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
30e60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
30e70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
30e80 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
30e90 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
30ea0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
30eb0 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
30ec0 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
30ed0 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
30ee0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
30ef0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
30f00 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
30f10 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
30f20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
30f30 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
30f40 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
30f50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
30f60 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
30f70 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
30f80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30f90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30fa0 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
30fb0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
30fc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30fd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
30fe0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
30ff0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
31000 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
31010 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
31020 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31030 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
31040 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
31050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31060 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
31070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
31080 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
31090 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
310a0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
310b0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
310c0 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
310d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
310e0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
310f0 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
31100 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
31110 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
31120 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
31130 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
31140 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
31150 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
31160 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
31170 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
31180 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
31190 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
311a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
311b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
311c0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
311d0 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
311e0 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
311f0 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
31200 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
31210 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
31220 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
31230 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
31240 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
31250 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
31260 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
31270 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
31280 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78    }.    pCur->ix
31290 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
312a0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
312b0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
312c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
312d0 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
312e0 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
312f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
31300 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
31310 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
31320 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
31330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31340 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
31350 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
31360 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
31370 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
31380 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
31390 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
313a0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
313b0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
313c0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
313d0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
313e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
313f0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
31400 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
31410 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
31420 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
31430 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
31440 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
31450 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
31460 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
31470 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
31480 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
31490 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
314a0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
314b0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
314c0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
314d0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
314e0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
314f0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
31500 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
31510 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
31520 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
31530 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
31540 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
31550 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
31560 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
31570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
31580 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72   an estimate for
31590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
315a0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
315b0 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
315c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52   pointing to.  R
315d0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
315e0 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73   number if no es
315f0 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e  timate is curren
31600 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  tly .** availabl
31610 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  e..*/.i64 sqlite
31620 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73  3BtreeRowCountEs
31630 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
31640 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38  ){.  i64 n;.  u8
31650 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   i;..  assert( c
31660 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
31670 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
31680 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31690 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
316a0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
316b0 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e   );..  /* Curren
316c0 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61  tly this interfa
316d0 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ce is only calle
316e0 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d  d by the OP_IfSm
316f0 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64  aller.  ** opcod
31700 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63  e, and it that c
31710 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  ase the cursor w
31720 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61  ill always be va
31730 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c  lid and.  ** wil
31740 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74  l always point t
31750 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a  o a leaf node. *
31760 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  /.  if( NEVER(pC
31770 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
31780 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75  OR_VALID) ) retu
31790 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56  rn -1;.  if( NEV
317a0 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ER(pCur->pPage->
317b0 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72  leaf==0) ) retur
317c0 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75  n -1;..  n = pCu
317d0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  r->pPage->nCell;
317e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
317f0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
31800 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e  .    n *= pCur->
31810 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c  apPage[i]->nCell
31820 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
31830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
31840 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
31850 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
31860 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
31870 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75   .** Return valu
31880 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49  e:.**.**    SQLI
31890 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63  TE_OK        suc
318a0 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54  cess.**    SQLIT
318b0 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73  E_DONE      curs
318c0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
318d0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61  inting at the la
318e0 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20  st element.**   
318f0 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20   otherwise      
31900 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
31910 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
31920 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
31930 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
31940 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
31950 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
31960 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
31970 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
31980 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
31990 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
319a0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
319b0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
319c0 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
319d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
319e0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
319f0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
31a00 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
31a10 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
31a20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
31a30 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
31a40 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
31a50 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
31a60 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
31a70 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
31a80 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c   argument in sql
31a90 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c  ite3BtreeNext(C,
31aa0 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68  F) is 1, then th
31ab0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72  e.** cursor corr
31ac0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
31ad0 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
31ae0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
31af0 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
31b00 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
31b10 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
31b20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
31b30 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  he F argument.**
31b40 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68   is a hint to th
31b50 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51  e implement.  SQ
31b60 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
31b70 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
31b80 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68  ot use.** this h
31b90 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
31ba0 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
31bb0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
31bc0 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
31bd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
31be0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
31bf0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
31c00 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
31c10 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
31c20 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
31c30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
31c40 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
31c50 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
31c60 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
31c70 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
31c80 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
31c90 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
31ca0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
31cb0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
31cc0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
31cd0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
31ce0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
31cf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31d00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
31d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31d20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
31d30 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
31d40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31d50 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
31d60 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
31d70 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
31d80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
31d90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
31da0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
31db0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
31dc0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
31dd0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
31de0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
31df0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
31e00 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
31e10 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
31e20 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
31e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
31e40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
31e50 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
31e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
31e70 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
31e80 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
31e90 2d 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20  ->ix;.  assert( 
31ea0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
31eb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
31ec0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
31ed0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
31ee0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
31ef0 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
31f00 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
31f10 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
31f20 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
31f30 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
31f40 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
31f50 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
31f60 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
31f70 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
31f80 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
31f90 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
31fa0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
31fb0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
31fc0 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
31fd0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
31fe0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
31ff0 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
32000 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
32010 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
32020 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
32030 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
32040 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
32050 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
32060 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
32070 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
32080 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
32090 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
320a0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
320b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
320c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
320d0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
320e0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
320f0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
32100 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
32110 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
32120 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
32130 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
32140 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
32150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32160 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
32170 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
32180 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
32190 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
321a0 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  >ix>=pPage->nCel
321b0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
321c0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
321d0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
321e0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
321f0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
32200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
32210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
32220 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
32230 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
32240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
32250 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
32260 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
32270 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
32280 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
32290 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
322a0 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  r, int flags){. 
322b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
322c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
322d0 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f  TER( flags );  /
322e0 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32  * Used in COMDB2
322f0 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20   but not native 
32300 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65  SQLite */.  asse
32310 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
32320 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
32330 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
32340 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
32350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
32360 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
32370 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
32380 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
32390 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
323a0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
323b0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
323c0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
323d0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
323e0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
323f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
32400 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
32410 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20  (pCur);.  pPage 
32420 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
32430 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78   if( (++pCur->ix
32440 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )>=pPage->nCell 
32450 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ){.    pCur->ix-
32460 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  -;.    return bt
32470 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20  reeNext(pCur);. 
32480 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
32490 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
324a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
324b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
324c0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
324d0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
324e0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
324f0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
32500 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
32510 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
32520 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72  tabase..** Retur
32530 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20  n values:.**.** 
32540 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
32550 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
32560 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74   SQLITE_DONE   t
32570 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
32580 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73  eady on the firs
32590 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  t element of the
325a0 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74   table.**     ot
325b0 68 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65  herwise     some
325c0 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
325d0 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
325e0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
325f0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
32600 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
32610 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
32620 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
32630 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
32640 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
32650 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
32660 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
32670 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
32680 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
32690 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
326a0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
326b0 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
326c0 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
326d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
326e0 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
326f0 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
32700 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
32710 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
32720 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
32730 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66  * If bit 0x01 of
32740 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   the F argument 
32750 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
32760 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20  revious(C,F) is 
32770 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  1, then.** the c
32780 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
32790 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
327a0 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
327b0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
327c0 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
327d0 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
327e0 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
327f0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
32800 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
32810 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
32820 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69  ement.  The nati
32830 76 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ve SQLite btree 
32840 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
32850 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74  oes not.** use t
32860 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
32870 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
32880 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
32890 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72  LINE int btreePr
328a0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
328b0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
328c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
328d0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
328e0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
328f0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
32900 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
32910 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
32920 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
32930 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
32940 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
32950 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
32960 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
32970 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
32980 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
32990 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
329a0 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
329b0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
329c0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
329d0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
329e0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
329f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32a00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32a20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
32a30 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
32a40 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
32a50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
32a60 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
32a70 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
32a80 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
32a90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
32aa0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
32ab0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
32ac0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
32ad0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
32ae0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
32af0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
32b00 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
32b10 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
32b20 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
32b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32b40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
32b50 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
32b60 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
32b70 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
32b80 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
32b90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
32ba0 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
32bb0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
32bc0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
32bd0 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  >ix;.    rc = mo
32be0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
32bf0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
32c00 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
32c10 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
32c20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
32c30 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
32c40 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
32c50 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
32c60 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  r->ix==0 ){.    
32c70 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
32c80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
32c90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
32ca0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
32cb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
32cc0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
32cd0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
32ce0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
32cf0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
32d00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
32d10 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
32d20 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
32d30 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f  s & (BTCF_ValidO
32d40 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
32d50 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
32d60 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
32d70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Page;.    if( pP
32d80 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
32d90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
32da0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32db0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
32dc0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
32dd0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
32de0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
32df0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32e00 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
32e10 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
32e20 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
32e30 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
32e40 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
32e50 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
32e60 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
32e70 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
32e80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
32e90 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
32ea0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
32eb0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55  SOR_VALID );.  U
32ec0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32ed0 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
32ee0 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
32ef0 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
32f00 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
32f10 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
32f20 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
32f30 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
32f40 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
32f50 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
32f60 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
32f70 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
32f80 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
32f90 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70  =0.   || pCur->p
32fa0 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  Page->leaf==0.  
32fb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
32fc0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
32fd0 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  );.  }.  pCur->i
32fe0 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x--;.  return SQ
32ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
33000 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
33010 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
33020 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
33030 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
33040 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
33050 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
33060 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
33070 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
33080 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
33090 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
330a0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
330b0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
330c0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
330d0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
330e0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
330f0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
33100 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
33110 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
33120 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
33130 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
33140 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
33150 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
33160 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
33170 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
33180 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
33190 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20  or.  *ppPage is 
331a0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74  set to NULL in t
331b0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
331c0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
331d0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
331e0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
331f0 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69  then an effort i
33200 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
33210 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
33220 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
33230 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
33240 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
33250 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
33260 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
33270 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
33280 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
33290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
332a0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
332b0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
332c0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
332d0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
332e0 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72   eMode parameter
332f0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   is BTALLOC_EXAC
33300 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79  T and the nearby
33310 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20   page exists.** 
33320 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
33330 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
33340 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
33350 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
33360 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73    If.** eMode is
33370 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e   BTALLOC_LT then
33380 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e   the page return
33390 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20  ed will be less 
333a0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
333b0 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e   to nearby if an
333c0 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  y such page exis
333d0 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73  ts.  If eMode is
333e0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65   BTALLOC_ANY the
333f0 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  n there.** are n
33400 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  o restrictions o
33410 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20  n which page is 
33420 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
33430 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
33440 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
33450 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
33460 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
33470 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
33480 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20  ppPage,      /* 
33490 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f  Store pointer to
334a0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
334b0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  age here */.  Pg
334c0 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20  no *pPgno,      
334d0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
334e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65  e page number he
334f0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61  re */.  Pgno nea
33500 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rby,           /
33510 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70  * Search for a p
33520 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e  age near this on
33530 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20  e */.  u8 eMode 
33540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33550 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20   BTALLOC_EXACT, 
33560 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42  BTALLOC_LT, or B
33570 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b  TALLOC_ANY */.){
33580 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
33590 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
335a0 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
335b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
335c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
335d0 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
335e0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
335f0 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
33600 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
33610 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
33620 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
33630 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
33640 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
33650 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
33660 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
33670 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
33680 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33690 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
336a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
336b0 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  rt( eMode==BTALL
336c0 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62  OC_ANY || (nearb
336d0 79 3e 30 20 26 26 20 52 45 51 55 49 52 45 5f 50  y>0 && REQUIRE_P
336e0 54 52 4d 41 50 20 29 20 29 3b 0a 20 20 70 50 61  TRMAP ) );.  pPa
336f0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
33700 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
33710 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
33720 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
33730 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
33740 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
33750 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
33760 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
33770 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
33780 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
33790 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
337a0 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
337b0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
337c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
337d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
337e0 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
337f0 69 66 28 20 49 53 43 4f 4e 43 55 52 52 45 4e 54  if( ISCONCURRENT
33800 3d 3d 30 20 26 26 20 6e 3e 3d 6d 78 50 61 67 65  ==0 && n>=mxPage
33810 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33820 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33830 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e  PT;.  }..  /* En
33840 73 75 72 65 20 70 61 67 65 20 31 20 69 73 20 77  sure page 1 is w
33850 72 69 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  ritable. This fu
33860 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 65 69 74 68  nction will eith
33870 65 72 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75  er change the nu
33880 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 70 61 67  mber.  ** of pag
33890 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  es in the free-l
338a0 69 73 74 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ist or the size 
338b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
338c0 66 69 6c 65 2e 20 53 69 6e 63 65 20 62 6f 74 68  file. Since both
338d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 6f  .  ** of these o
338e0 70 65 72 61 74 69 6f 6e 73 20 69 6e 76 6f 6c 76  perations involv
338f0 65 20 6d 6f 64 69 66 79 69 6e 67 20 70 61 67 65  e modifying page
33900 20 31 20 68 65 61 64 65 72 20 66 69 65 6c 64 73   1 header fields
33910 2c 20 70 61 67 65 20 31 0a 20 20 2a 2a 20 77 69  , page 1.  ** wi
33920 6c 6c 20 64 65 66 69 6e 69 74 65 6c 79 20 62 65  ll definitely be
33930 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 69 73   written by this
33940 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
33950 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f 4e 43   this is an CONC
33960 55 52 52 45 4e 54 0a 20 20 2a 2a 20 74 72 61 6e  URRENT.  ** tran
33970 73 61 63 74 69 6f 6e 2c 20 65 6e 73 75 72 65 20  saction, ensure 
33980 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70 20  the BtreePtrmap 
33990 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62 65  structure has be
339a0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a  en allocated.  *
339b0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
339c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
339d0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
339e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
339f0 63 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b  c;..  if( n>0 ){
33a00 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
33a10 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
33a20 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
33a30 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
33a40 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
33a50 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
33a60 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
33a70 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
33a80 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
33a90 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
33aa0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
33ab0 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
33ac0 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
33ad0 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
33ae0 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
33af0 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
33b00 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
33b10 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
33b20 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
33b30 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
33b40 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
33b50 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
33b60 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
33b70 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
33b80 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
33b90 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
33ba0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
33bb0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
33bc0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
33bd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
33be0 53 41 55 54 4f 56 41 43 55 55 4d 21 3d 49 53 43  SAUTOVACUUM!=ISC
33bf0 4f 4e 43 55 52 52 45 4e 54 20 29 3b 0a 20 20 20  ONCURRENT );.   
33c00 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
33c10 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UUM ){.        i
33c20 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
33c30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  e ){.          u
33c40 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
33c50 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
33c60 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  y>0 );.         
33c70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
33c80 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
33c90 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
33ca0 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
33cb0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
33cc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
33cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33ce0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
33cf0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
33d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33d10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
33d20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
33d40 65 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  e{.        searc
33d50 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
33d60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
33d70 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
33d80 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
33d90 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
33da0 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
33db0 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
33dc0 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
33dd0 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
33de0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
33df0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
33e00 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
33e10 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
33e20 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
33e30 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
33e40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
33e50 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
33e60 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
33e70 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
33e80 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
33e90 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
33ea0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
33eb0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
33ec0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
33ed0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
33ee0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
33ef0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
33f00 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
33f10 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
33f20 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
33f30 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
33f40 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
33f50 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
33f60 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
33f70 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
33f80 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
33f90 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
33fa0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
33fb0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
33fc0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
33fd0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
33fe0 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
33ff0 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
34000 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
34010 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
34020 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
34030 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
34040 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
34050 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
34060 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
34070 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
34080 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
34090 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
340a0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
340b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
340c0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
340d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
340e0 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
340f0 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
34100 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
34110 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
34120 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
34130 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
34140 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
34150 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
34160 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
34170 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
34180 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
34190 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
341a0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
341b0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
341c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
341d0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
341e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
341f0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
34200 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
34210 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
34220 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
34230 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
34240 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65  ORRUPT_PGNO(pPre
34250 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72  vTrunk ? pPrevTr
34260 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a  unk->pgno : 1);.
34270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34280 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
34290 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
342a0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
342b0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
342c0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
342d0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
342e0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
342f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
34300 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
34310 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
34320 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
34330 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
34340 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
34350 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
34360 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
34370 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
34380 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
34390 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
343a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
343b0 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
343c0 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
343d0 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
343e0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
343f0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
34400 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
34410 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
34420 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
34430 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
34440 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
34450 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
34460 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
34470 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
34480 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
34490 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
344a0 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
344b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
344c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
344d0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
344e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
344f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34500 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
34510 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
34520 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34530 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
34540 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
34550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
34560 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
34570 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
34580 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
34590 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
345a0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
345b0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
345c0 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
345d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
345e0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
345f0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
34600 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
34610 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
34620 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34630 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
34640 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
34650 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
34660 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
34670 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
34680 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
34690 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
346a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
346b0 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
346c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
346d0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
346e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
346f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
34700 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
34710 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
34720 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
34730 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
34740 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
34750 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
34760 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34770 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
34780 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
34790 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
347a0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
347b0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
347c0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
347d0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
347e0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
347f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
34800 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
34810 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
34820 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
34830 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
34840 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
34850 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34860 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
34870 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34880 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
34890 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
348a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
348b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
348c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
348d0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
348e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
348f0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
34900 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
34910 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
34920 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
34930 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
34940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34950 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
34960 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34970 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34990 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
349a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
349b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
349c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
349d0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
349e0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
349f0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
34a00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34a20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
34a30 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
34a40 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
34a50 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
34a60 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
34a70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
34a80 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
34a90 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
34aa0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
34ab0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
34ac0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
34ad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34ae0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
34af0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
34b00 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
34b10 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
34b20 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
34b30 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
34b40 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
34b50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
34b60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34b70 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
34b80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
34b90 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
34ba0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
34bb0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
34bc0 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
34bd0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
34be0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
34bf0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
34c00 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
34c10 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
34c20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34c40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
34c50 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
34c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34c80 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
34c90 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
34ca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
34cb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34cc0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
34cd0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
34ce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
34cf0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
34d00 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
34d10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
34d20 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
34d30 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
34d40 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
34d50 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
34d60 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
34d70 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
34d80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
34d90 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
34da0 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
34db0 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
34dc0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
34dd0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
34de0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
34df0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
34e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34e10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
34e20 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34e30 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
34e40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
34e50 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
34e60 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
34e70 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
34e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34e90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34ea0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
34eb0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
34ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
34ed0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34ee0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
34ef0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
34f00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
34f10 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
34f20 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
34f30 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
34f40 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
34f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34f60 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
34f70 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
34f80 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
34f90 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
34fa0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
34fb0 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
34fc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34fd0 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
34fe0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
34ff0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
35000 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
35010 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
35020 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
35030 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
35040 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
35050 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
35060 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
35070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
35080 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
35090 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
350a0 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
350b0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
350c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
350d0 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
350e0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
350f0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
35100 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
35110 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
35120 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
35130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35140 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
35150 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
35160 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
35170 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
35180 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
35190 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
351a0 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
351b0 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
351c0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
351d0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
351e0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
351f0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
35200 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
35210 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
35220 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
35230 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
35240 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
35250 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
35260 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
35270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
35280 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
35290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
352a0 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
352b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
352c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
352d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
352e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
352f0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
35300 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
35310 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
35320 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
35330 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
35340 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
35350 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
35360 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
35370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
35380 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35390 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
353a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
353b0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
353c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
353d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
353e0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
353f0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
35400 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
35410 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
35420 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
35430 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
35440 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
35450 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
35460 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
35470 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
35480 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
35490 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
354a0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
354b0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
354c0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
354d0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
354e0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
354f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35500 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
35510 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
35520 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
35530 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35540 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35550 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
35560 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
35570 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
35580 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
35590 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
355a0 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
355b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
355c0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
355d0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
355e0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
355f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
35600 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
35610 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
35620 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
35630 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
35640 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
35650 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
35660 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
35670 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
35680 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
35690 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
356a0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
356b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
356c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
356d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
356e0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
356f0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
35700 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
35710 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
35730 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
35740 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
35750 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
35760 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
35770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35780 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
35790 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
357a0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
357b0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
357c0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
357d0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
357e0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
357f0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
35800 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
35810 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
35820 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
35830 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
35840 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
35850 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
35860 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
35870 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
35880 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
35890 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
358a0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
358b0 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
358c0 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
358d0 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
358e0 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
358f0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
35900 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
35910 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
35920 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
35930 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
35940 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
35950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
35960 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
35970 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
35980 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
35990 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
359a0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
359b0 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
359c0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
359d0 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
359e0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
359f0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
35a00 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
35a10 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
35a20 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
35a30 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
35a40 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
35a50 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
35a60 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
35a70 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
35a80 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
35a90 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
35aa0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
35ab0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
35ac0 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
35ad0 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
35ae0 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
35af0 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
35b00 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
35b10 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
35b20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
35b30 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
35b40 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
35b50 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
35b60 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
35b70 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
35b80 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
35b90 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
35ba0 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
35bb0 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
35bc0 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
35bd0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
35be0 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
35bf0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
35c00 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
35c10 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
35c20 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
35c30 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
35c40 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
35c50 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
35c60 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
35c70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
35c80 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
35c90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
35ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
35cb0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
35cc0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
35cd0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
35ce0 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
35cf0 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
35d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35d10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
35d20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
35d30 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
35d40 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
35d50 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
35d60 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
35d70 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
35d80 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
35d90 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
35da0 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
35db0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
35dc0 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
35dd0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
35de0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
35df0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
35e00 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
35e10 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
35e20 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
35e30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35e40 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
35e50 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
35e60 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
35e70 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
35e80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
35e90 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
35ea0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
35eb0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
35ec0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
35ed0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
35ee0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
35ef0 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  dPage(pBt, pBt->
35f00 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
35f10 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
35f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35f30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
35f40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35f50 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
35f60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
35f70 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
35f80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
35f90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
35fa0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
35fb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
35fc0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
35fd0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
35fe0 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
35ff0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
36000 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
36010 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
36020 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
36030 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
36040 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
36050 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
36060 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
36070 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
36080 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
36090 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
360a0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
360b0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
360c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
360d0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
360e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
360f0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
36100 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
36110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36120 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
36130 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
36140 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
36150 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
36160 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
36170 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
36180 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
36190 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
361a0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
361b0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
361c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
361d0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
361e0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
361f0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
36200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
36210 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
36220 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
36230 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
36240 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b  ->pDbPage)<=1 );
36250 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
36260 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70  QLITE_OK || (*pp
36270 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
36280 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
36290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
362a0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
362b0 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
362c0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
362d0 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
362e0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
362f0 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
36300 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
36310 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
36320 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
36330 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
36340 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
36350 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
36360 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
36370 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
36380 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
36390 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
363a0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
363b0 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
363c0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
363d0 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
363e0 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
363f0 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
36400 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
36410 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
36420 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
36430 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
36440 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
36450 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
36460 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
36470 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
36480 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
36490 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
364a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
364b0 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
364c0 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
364d0 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
364e0 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
364f0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
36500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36510 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
36520 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
36530 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
36540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36550 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36560 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
36570 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
36580 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
36590 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
365a0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
365b0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
365c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
365d0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
365e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
365f0 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
36600 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
36610 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
36620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36630 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
36640 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
36650 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
36660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36670 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
36680 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
36690 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
366a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
366b0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
366c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
366d0 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67  RRUPT_DB || iPag
366e0 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
366f0 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
36700 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
36710 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50  age );..  if( iP
36720 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53  age<2 ) return S
36730 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
36740 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  PT;.  if( pMemPa
36750 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
36760 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
36770 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
36780 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
36790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
367a0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
367b0 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
367c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
367d0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
367e0 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
367f0 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
36800 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36810 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
36820 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
36830 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
36840 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
36850 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
36860 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
36870 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
36880 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
36890 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  ;..  if( pBt->bt
368a0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
368b0 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
368c0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
368d0 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
368e0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
368f0 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
36900 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
36910 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
36920 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
36930 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
36940 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
36950 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
36960 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
36970 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
36980 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
36990 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
369a0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
369b0 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
369c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
369d0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
369e0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
369f0 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
36a00 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
36a10 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
36a20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
36a30 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
36a40 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
36a50 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
36a60 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
36a70 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
36a80 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
36a90 20 20 2a 2f 0a 20 20 69 66 28 20 52 45 51 55 49    */.  if( REQUI
36aa0 52 45 5f 50 54 52 4d 41 50 20 29 7b 0a 20 20 20  RE_PTRMAP ){.   
36ab0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
36ac0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
36ad0 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
36ae0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
36af0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
36b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
36b10 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
36b20 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
36b30 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
36b40 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
36b50 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
36b60 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
36b70 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
36b80 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
36b90 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
36ba0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
36bb0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
36bc0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
36bd0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
36be0 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
36bf0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
36c00 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
36c10 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
36c20 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
36c30 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
36c40 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
36c50 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
36c60 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
36c70 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
36c80 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
36c90 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
36ca0 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
36cb0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
36cc0 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
36cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36ce0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
36cf0 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
36d00 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
36d10 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
36d20 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
36d30 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
36d40 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
36d50 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
36d60 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
36d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36d80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
36d90 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
36da0 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
36db0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
36dc0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
36dd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
36de0 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
36df0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
36e00 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
36e10 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
36e20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
36e30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
36e40 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
36e50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
36e60 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
36e70 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
36e80 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
36e90 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
36ea0 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
36eb0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
36ec0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
36ed0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
36ee0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
36ef0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
36f00 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
36f10 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
36f20 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
36f30 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
36f40 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
36f50 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
36f60 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
36f70 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
36f80 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
36f90 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
36fa0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
36fb0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
36fc0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
36fd0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
36fe0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
36ff0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
37000 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
37010 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
37020 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
37030 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
37040 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
37050 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
37060 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
37070 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
37080 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
37090 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
370a0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
370b0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
370c0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
370d0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
370e0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
370f0 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
37100 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
37110 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
37120 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
37130 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
37140 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
37150 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
37160 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
37170 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
37180 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
37190 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
371a0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
371b0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
371c0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
371d0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
371e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
371f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
37200 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
37210 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
37220 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
37230 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
37240 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
37250 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
37260 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
37270 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
37280 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
37290 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
372a0 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
372b0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
372c0 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
372d0 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
372e0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
372f0 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
37300 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
37310 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37320 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
37330 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
37340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37350 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
37360 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
37370 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
37380 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
37390 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
373a0 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
373b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
373c0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
373d0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
373e0 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
373f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
37400 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
37410 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
37420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37430 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
37440 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
37450 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
37460 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
37470 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
37480 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
37490 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
374a0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
374b0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
374c0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
374d0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
374e0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
374f0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
37500 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
37510 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
37520 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
37530 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
37540 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
37550 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
37560 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
37570 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
37580 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
37590 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
375a0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
375b0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
375c0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
375d0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
375e0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
375f0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
37600 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
37610 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
37620 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
37630 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
37640 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
37650 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
37660 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
37670 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
37680 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
37690 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
376a0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
376b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
376c0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
376d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
376e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
376f0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
37700 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
37710 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
37720 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
37730 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
37740 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
37750 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
37760 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
37770 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
37780 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
37790 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
377a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
377b0 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
377c0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
377d0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
377e0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
377f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
37800 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
37810 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
37820 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
37830 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
37840 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
37850 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
37860 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
37870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
37880 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
37890 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
378a0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
378b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
378c0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
378d0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
378e0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
378f0 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
37900 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
37910 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
37920 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
37930 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
37940 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
37950 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
37960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
37970 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
37980 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
37990 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
379a0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
379b0 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
379c0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
379d0 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
379e0 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
379f0 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
37a00 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo          /* 
37a10 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  Size information
37a20 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20   about the cell 
37a30 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
37a40 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76   *pBt;.  Pgno ov
37a50 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
37a60 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
37a70 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
37a80 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
37a90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37aa0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
37ab0 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
37ac0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
37ad0 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
37ae0 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c  .  if( pInfo->nL
37af0 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61  ocal==pInfo->nPa
37b00 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74  yload ){.    ret
37b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
37b20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
37b30 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
37b40 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
37b50 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
37b60 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53   pCell+pInfo->nS
37b70 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61  ize-1 > pPage->a
37b80 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
37b90 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  Page ){.    /* C
37ba0 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
37bb0 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
37bc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37bd0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
37be0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
37bf0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
37c00 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70  t4byte(pCell + p
37c10 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29  Info->nSize - 4)
37c20 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
37c30 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
37c40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
37c50 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
37c60 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
37c70 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
37c80 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e  Ovfl = (pInfo->n
37c90 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d  Payload - pInfo-
37ca0 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  >nLocal + ovflPa
37cb0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
37cc0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
37cd0 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a  rt( nOvfl>0 || .
37ce0 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20      (CORRUPT_DB 
37cf0 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  && (pInfo->nPayl
37d00 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  oad + ovflPageSi
37d10 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65  ze)<ovflPageSize
37d20 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
37d30 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
37d40 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
37d50 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
37d60 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
37d70 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
37d80 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
37d90 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
37da0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
37db0 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
37dc0 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
37dd0 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
37de0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
37df0 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
37e00 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
37e10 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
37e20 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
37e30 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
37e40 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
37e50 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
37e60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37e70 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
37e80 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
37e90 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
37ea0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
37eb0 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
37ec0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
37ed0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
37ee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
37ef0 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
37f00 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
37f10 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
37f20 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
37f30 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
37f40 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
37f50 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
37f60 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
37f70 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
37f80 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
37f90 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
37fa0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
37fb0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
37fc0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
37fd0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
37fe0 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
37ff0 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
38000 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
38010 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
38020 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
38030 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
38040 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
38050 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
38060 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
38070 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
38080 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
38090 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
380a0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
380b0 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
380c0 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
380d0 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
380e0 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
380f0 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
38100 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
38110 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
38120 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
38130 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
38140 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
38150 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
38160 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
38170 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
38180 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
38190 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
381a0 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
381b0 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
381c0 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
381d0 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
381e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
381f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
38200 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38210 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
38220 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
38230 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
38240 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
38250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
38260 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
38270 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
38280 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
38290 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
382a0 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
382b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
382c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
382d0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
382e0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
382f0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
38300 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
38310 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
38320 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
38330 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
38340 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
38350 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
38360 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
38370 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
38380 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
38390 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
383a0 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
383b0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
383c0 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
383d0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
383e0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
383f0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
38400 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
38410 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
38420 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
38430 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
38440 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
38450 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
38460 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
38470 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
38480 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
38490 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
384a0 74 68 65 6e 20 63 6f 70 69 65 64